2012-11-22 16 views
5

Si verifica un problema durante la configurazione di un comportamento del servizio WCF.ServiceBehavior per WCF REST

Alcuni sfondi. Fondamentalmente sto sviluppando un servizio WCF REST che dovrebbe funzionare su IIS. Devo essere in grado di registrare le eccezioni generate dal servizio (sto utilizzando log4net) e restituire i codici di stato HTTP in base al tipo di eccezione. Voglio che la mia implementazione del servizio abbia una conoscenza minima delle cose relative a WCF, quindi non voglio convertire le eccezioni in FaultException in tutto il servizio. Quindi ho capito che aggiungere il mio IErrorHandler all'host del servizio sarebbe il modo migliore per farlo.

Il mio problema è comunque che, indipendentemente da ciò che provo, non riesco a ottenere la configurazione per il mio servizio personalizzato di destra in Web.config. Ecco il codice pertinente.

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.

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

Dove ExceptionModule implementa IErrorHandler.

risposta

2

Si dispone di una sezione <serviceBehavior> denominata "UsingErrorLogBehavior", ma nessuna configurazione di servizio fa riferimento a tale sezione. È possibile rendere quella sezione il comportamento del serviziopredefinito (non dando un nome, come si dispone per il comportamento finale), o aggiungere un elemento <service> per il servizio che fa riferimento che il comportamento:

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