2012-11-22 16 views
5

के लिए सेवा व्यवहारकर्ता मुझे मेरी डब्ल्यूसीएफ सेवा के लिए सेवाकर्ता को कॉन्फ़िगर करने में समस्या है।डब्ल्यूसीएफ आरईएसटी

कुछ पृष्ठभूमि। असल में मैं एक आरईएसटी सेवा डब्ल्यूसीएफ विकसित कर रहा हूं जो आईआईएस पर चलाना है। मुझे सेवा द्वारा फेंकने वाले अपवादों को लॉग करने में सक्षम होना चाहिए (मैं log4net का उपयोग कर रहा हूं) और अपवाद के प्रकार के आधार पर HTTP स्थिति कोड वापस कर सकता हूं। मैं चाहता हूं कि मेरा सेवा कार्यान्वयन डब्ल्यूसीएफ से संबंधित सामानों का न्यूनतम ज्ञान प्राप्त करे, इसलिए मैं अपवाद को सेवा में हर जगह FaultException में परिवर्तित नहीं करना चाहता हूं। तो मुझे पता चला कि सेवा होस्ट में अपना खुद का आईरर हैंडलर जोड़ना इसे करने का सबसे अच्छा तरीका होगा।

मेरी समस्या यह है कि कोई फर्क नहीं पड़ता कि मैं कोशिश करता हूं कि मैं अपने कस्टम सेवा व्यवहार के लिए कॉन्फ़िगरेशन को वेब.कॉन्फिग में ठीक नहीं लग रहा हूं। यहां प्रासंगिक कोड है।

वेब कॉन्फ़िगरेशन।

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"> 
    <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> 
    </modules> 
</system.webServer> 

<system.serviceModel> 
    <behaviors> 
    <serviceBehaviors> 
     <behavior name="UsingErrorLogBehavior"> 
     <errorLogBehavior/> 
     </behavior> 
    </serviceBehaviors> 
    <endpointBehaviors> 
     <behavior> 
     <webHttp/> 
     </behavior> 
    </endpointBehaviors> 
    </behaviors> 
    <extensions> 
    <behaviorExtensions> 
     <add name="errorLogBehavior" 
      type="MyNameSpace.Web.ErrorExtensionElement, MyNameSpace.Web"/> 
    </behaviorExtensions> 
    </extensions> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> 
    <standardEndpoints> 
    <webHttpEndpoint> 
     <standardEndpoint name="" helpEnabled="true" 
         automaticFormatSelectionEnabled="false" 
         defaultOutgoingResponseFormat="Json" 
         maxReceivedMessageSize="4194304" transferMode="Buffered" /> 
    </webHttpEndpoint> 
    </standardEndpoints> 
</system.serviceModel> 

ErrorExtensionElement।

namespace MyNameSpace.Web 
{ 
    public class ErrorExtensionElement : BehaviorExtensionElement 
    { 
     public override Type BehaviorType 
     { 
      get { return typeof(ErrorServiceBehavior); } 
     } 

     protected override object CreateBehavior() 
     { 
      return new ErrorServiceBehavior(); 
     } 
    } 
} 

त्रुटि सेवाकर्ता।

namespace MyNameSpace.Web 
{ 
    public class ErrorServiceBehavior : IServiceBehavior 
    { 
     public void AddBindingParameters(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, System.ServiceModel.Channels.BindingParameterCollection bindingParameters) 
     { 
     } 

     public void ApplyDispatchBehavior(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase) 
     { 
      foreach (ChannelDispatcher channelDispatcher in serviceHostBase.ChannelDispatchers) 
      { 
       channelDispatcher.ErrorHandlers.Add(new ExceptionModule()); 
      } 
     } 

     public void Validate(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase) 
     { 
     } 
    } 
} 

ExceptionModule कहाँ लागू करता IErrorHandler।

उत्तर

2

आपके पास <serviceBehavior> अनुभाग "UsingErrorLogBehavior" नामक अनुभाग है, लेकिन कोई सेवा कॉन्फ़िगरेशन उस अनुभाग का संदर्भ नहीं दे रहा है। आप उस अनुभाग डिफ़ॉल्ट सेवा व्यवहार कर सकते हैं या तो (यह एक नाम नहीं देकर, जैसे आप अंत बिंदु व्यवहार के लिए है), या संदर्भ देता है जो कि व्यवहार आपकी सेवा के लिए <service> तत्व जोड़:

<services> 
    <service name="YourNamespace.YourServiceName" 
      behaviorConfiguration="UsingErrorLogBehavior"> 
    <endpoint address="" 
       binding="webHttpBinding" 
       contract="YourNamespace.YourContractName" /> 
    </service> 
</services> 
संबंधित मुद्दे