2012-11-22 18 views
5
için ServiceBehavior

WCF hizmetim için ServiceBehavior yapılandırırken bir sorunum var.WCF REST

Bazı arka plan. Temel olarak, IIS üzerinde çalışması beklenen bir REST hizmeti WCF geliştiriyorum. Hizmet tarafından atılan özel durumları (log4net kullanıyorum) ve HTTP durum kodlarını istisna türüne bağlı olarak döndürmem gerekiyor. Hizmet uygulamamın en az WCF ile ilgili bilgilere sahip olmasını istiyorum, bu nedenle istisnaları serviste her yerde FaultException'a dönüştürmek istemiyorum. Bu yüzden, kendi IErrorHandler'ımı servis sunucusuna ekleyerek bunu yapmanın en iyi yolu olacağını anladım.

Sorunum, ne çalıştığım önemli değil, özel ServiceBehavior özelliğinin Web.config dosyasındaki yapılandırmasını göremiyorum. İşte ilgili kod.

Web config.

<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(); 
     } 
    } 
} 

ErrorServiceBehavior. ExceptionModule IErrorHandler uygulayan

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) 
     { 
     } 
    } 
} 

.

cevap

2

"UsingErrorLogBehavior" adlı bir <serviceBehavior> bölümünüz var, ancak bu bölüm referansta hiçbir hizmet yapılandırması yok. Sen (siz son nokta davranışı için var gibi, bir ad vermeyerek) o bölüm varsayılan hizmet davranışı yapmak veya bu davranışı başvuran hizmetinize ilişkin <service> unsur ekleyebilir ya:

<services> 
    <service name="YourNamespace.YourServiceName" 
      behaviorConfiguration="UsingErrorLogBehavior"> 
    <endpoint address="" 
       binding="webHttpBinding" 
       contract="YourNamespace.YourContractName" /> 
    </service> 
</services>