Dan*_*man 5 .net sql-server asp.net iis elmah
我正在尝试使用SQL Server 2008 R2在ASP.NET 4应用程序中配置ELMAH错误日志记录.有什么办法我可以告诉ELMAH在我们提供的连接字符串上调用我们的内部解密函数吗?我是否需要修改ELMAH源并重建?
<configSections>
<sectionGroup name="elmah">
<section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah" />
<section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah" />
<section name="errorMail" requirePermission="false" type="Elmah.ErrorMailSectionHandler, Elmah" />
<section name="errorFilter" requirePermission="false" type="Elmah.ErrorFilterSectionHandler, Elmah" />
</sectionGroup>
</configSections>
<elmah>
<security allowRemoteAccess="1" />
<errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="ELMAH" />
</elmah>
<connectionStrings>
<add name="ELMAH" connectionString="EncryptedConnectionString" providerName="System.Data.SqlClient" />
</connectionStrings>
<system.webServer>
<handlers>
<add name="Elmah" verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" preCondition="integratedMode" />
</handlers>
<modules>
<add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" />
</modules>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)
Ati*_*ziz 12
你不能告诉ELMAH对你的连接字符串做些什么.但是,您可以做的是告诉ELMAH在需要时给您回电ErrorLog,在运行时为您提供更多控制权.然后,您可以读取加密的连接字符串,使用内部函数对其进行解密,并返回使用它初始化的SqlErrorLog.
为此,您需要提供与ServiceProviderQueryHandler委托兼容的方法.这是定义:
public delegate IServiceProvider ServiceProviderQueryHandler(object context);
Run Code Online (Sandbox Code Playgroud)
该方法的实现必须返回实现的对象的实例IServiceProvider.如果您不想自己编写一个,可以从.NET Framework免费获得一个.见System.ComponentModel.Design.ServiceContainer.服务提供者GetService必须响应对该ErrorLog类型的请求,然后您可以返回SqlErrorLog已使用在运行时操作的连接字符串初始化的对象.这是一个可能的实现:
var parent = ServiceCenter.Current;
ServiceCenter.Current = context => {
var container = new ServiceContainer(parent(context));
var connectionSettings = ConfigurationManager.ConnectionStrings["FOOBAR"];
var connectionString = Decrypt(connectionSettings.ConnectionString);
var log = new SqlErrorLog(connectionString);
container.AddService(typeof(ErrorLog), log);
return container;
} ;
Run Code Online (Sandbox Code Playgroud)
这将捕获当前服务点并安装您自己的服务点.当lambda/delegate无法直接满足它时,会创建服务请求传递给捕获的服务点,从而创建一个链.您可以通过ServiceCenter.Current在应用程序初始化期间设置某个位置来告诉ELMAH您的实现,以便上面的代码需要放在哪里.
请记住,这是一个非常简单的实现,但它应该足以让您在需要时启动并稍后进行优化.
在1.2中添加之前,做类似事情的唯一方法需要子类化和其他体操,并且仍然产生部分结果.现在,您只需要实现一个方法并将其交给ELMAH,它只需根据服务类型响应来自ELMAH的查询对象.
| 归档时间: |
|
| 查看次数: |
3652 次 |
| 最近记录: |