2011-05-12 20 views
5

के साथ SQL सर्वर लॉगिंग के साथ ELMAH को कॉन्फ़िगर करना मैं SQL Server 2008 R2 का उपयोग कर ASP.NET 4 अनुप्रयोग में 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> 

उत्तर

12

आप केवल अपने कनेक्शन स्ट्रिंग के साथ कुछ करने के लिए 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; 
    } ; 

यह वर्तमान सेवा बिंदु को कैप्चर करता है और इसके बजाए अपना इंस्टॉल करता है। लैम्ब्डा/प्रतिनिधि ने कैप्चर किए गए सेवा बिंदु पर सेवा अनुरोधों पर पास किया है जब यह सीधे इसे संतुष्ट नहीं कर सकता है, इस प्रकार एक श्रृंखला बना सकता है। आप अपने आवेदन के आरंभ के दौरान कहीं भी ServiceCenter.Current सेट करके अपने कार्यान्वयन के बारे में ELMAH बताते हैं, जहां वह उपरोक्त कोड बैठने की आवश्यकता होगी।

ध्यान रखें कि यह एक बहुत ही सरल कार्यान्वयन है लेकिन यह आवश्यक होने पर बाद में शुरू करने और अनुकूलित करने के लिए पर्याप्त होना चाहिए।

इससे पहले addition in 1.2, इसी तरह के कुछ आवश्यक सबक्लासिंग और अन्य जिमनास्टिक करने का एकमात्र तरीका और अभी भी आंशिक परिणाम प्राप्त हुए। अब आपको केवल एक विधि को लागू करने और इसे ELMAH पर सौंपने की आवश्यकता है और जो कि ईएलएमएएच से उनके सेवा प्रकार के आधार पर वस्तुओं के लिए केवल प्रतिक्रियाओं का जवाब देता है।

+0

के अतिरिक्त के रूप में क्या इस कोड नमूने में 'मूल (संदर्भ)' है? – Doug

3

आतिफ अजीज के पद, यहाँ VB.NET संस्करण (.NET 2.0 संस्करण के लिए InitializeElmah_VB9 [lamdda बिना], InitializeElmah VB.NET के लिए .NET 4.0 के लिए)

Imports System.Web.SessionState 

Public Class Global_asax 
    Inherits System.Web.HttpApplication 


    Public Overrides Sub Init() 
     MyBase.Init() 

     InitializeElmah_VB9() 
     'InitializeElmah()' 
    End Sub 

    Public parent As Elmah.ServiceProviderQueryHandler = Nothing 

    Sub InitializeElmah_VB9() 
     ' TODO: Create Table + Functions ' 
     parent = Elmah.ServiceCenter.Current 
     Elmah.ServiceCenter.Current = AddressOf ElmahCallback 
    End Sub 

    Function ElmahCallback(objContext As Object) As System.IServiceProvider 
     Dim container As New System.ComponentModel.Design.ServiceContainer(parent(objContext)) 
     Dim connectionSettings As System.Configuration.ConnectionStringSettings = ConfigurationManager.ConnectionStrings("FOOBAR") 

     Dim strConnectionString As String = connectionSettings.ConnectionString 

     Dim x As New System.Data.SqlClient.SqlConnectionStringBuilder(strConnectionString) 
     x.Password = CryptStrings.DeCrypt(x.Password) 

     strConnectionString = x.ConnectionString 

     Dim log As Elmah.SqlErrorLog = New Elmah.SqlErrorLog(strConnectionString) 
     container.AddService(GetType(Elmah.ErrorLog), log) 
     Return container 
    End Function 

    Sub InitializeElmah() 
     ' TODO: Create Table + Functions ' 
     Dim parent As Elmah.ServiceProviderQueryHandler = Elmah.ServiceCenter.Current 
     Elmah.ServiceCenter.Current = Function(context) 
       Dim container As New System.ComponentModel.Design.ServiceContainer(parent(context)) 
       Dim connectionSettings As System.Configuration.ConnectionStringSettings = ConfigurationManager.ConnectionStrings("Foobar") 
       Dim connectionString As String = connectionSettings.ConnectionString 

       Dim x As New System.Data.SqlClient.SqlConnectionStringBuilder(connectionString) 

       x.Password = CryptStrings.DeCrypt(x.Password) 

       connectionString = x.ConnectionString 

       Dim log As Elmah.SqlErrorLog = New Elmah.SqlErrorLog(connectionString) 
       container.AddService(GetType(Elmah.ErrorLog), log) 

       Return container 
      End Function 

    End Sub 


    Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs) 
     ' Wird beim Starten der Anwendung ausgelöst 
    End Sub 


    Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs) 
     ' Wird beim Starten der Sitzung ausgelöst 
    End Sub 


    Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs) 
     ' Wird zu Beginn jeder Anforderung ausgelöst 
    End Sub 


    Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As EventArgs) 
     ' Wird beim Versuch der Benutzerauthentifizierung ausgelöst 
    End Sub 


    Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs) 
     ' Wird bei einem Fehler ausgelöst 
    End Sub 


    Sub Session_End(ByVal sender As Object, ByVal e As EventArgs) 
     ' Wird beim Beenden der Sitzung ausgelöst 
    End Sub 


    Sub Application_End(ByVal sender As Object, ByVal e As EventArgs) 
     ' Wird beim Beenden der Anwendung ausgelöst 
    End Sub 


End Class 
संबंधित मुद्दे