gpt4 book ai didi

.net - 使用加密连接字符串配置 ELMAH 和 SQL Server 日志记录

转载 作者:行者123 更新时间:2023-12-02 03:09:29 24 4
gpt4 key购买 nike

我正在尝试使用 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>

最佳答案

您不能只是告诉 ELMAH 对您的连接字符串执行某些操作。但是,您可以做的是告诉 ELMAH 在需要 ErrorLog 时给您回电,从而在运行时为您提供更多控制。然后,您可以读取加密的连接字符串,使用内部函数对其进行解密,并返回用它初始化的 SqlErrorLog。

为此,您需要提供一个与ServiceProviderQueryHandler代表。定义如下:

public delegate IServiceProvider ServiceProviderQueryHandler(object context); 

该方法的实现必须返回实现 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;
} ;

这将捕获当前服务点并安装您自己的服务点。创建的 lambda/委托(delegate)在无法传递服务请求时将其传递到捕获的服务点直接满足它,从而创建一条链。您可以通过在应用程序初始化期间在某处设置 ServiceCenter.Current 来告诉 ELMAH 您的实现情况,以便上面的代码需要放置在该位置。

请记住,这是一个非常简单的实现,但它应该足以帮助您入门并在需要时进行优化。

在此之前addition in 1.2 ,做类似事情的唯一方法需要子类化和其他体操,并且仍然产生部分结果。现在您只需实现一个方法并将其交给 ELMAH,该方法只需根据对象的服务类型响应 ELMAH 对对象的查询。

关于.net - 使用加密连接字符串配置 ELMAH 和 SQL Server 日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5981750/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com