2012-11-22 12 views
5

WCFサービスのServiceBehaviorを設定する際に問題があります。ServiceBehavior for WCF REST

いくつかの背景。 基本的に私はIIS上で動作するはずのRESTサービスWCFを開発しています。 サービスによってスローされた例外をログに記録する必要があります(私はlog4netを使用しています)、例外のタイプに応じてHTTPステータスコードを返します。 サービス実装がWCF関連の知識を最低限必要としたいので、例外をFaultExceptionに変換する必要はありません。 私は自分自身のIErrorHandlerをサービスホストに追加するのが最良の方法だと分かりました。

私の問題は、私が試しても、Web.configのカスタムServiceBehaviorの設定を取得できないようです。 関連するコードは次のとおりです。

Web設定。

<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を実装

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

答えて

2

「UseErrorLogBehavior」という名前の<serviceBehavior>セクションがありますが、そのセクションを参照するサービス構成はありません。あなたは(あなたがエンドポイントの振る舞いのために持っているように、それに名前を与えないことによって)そのセクションデフォルトサービス動作させる、またはその振る舞いを参照するあなたのサービスのための<service>要素を追加することができ、次のいずれか

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