1 つのサービスと複数のインターフェイス\エンド ポイントを持つ wcf (.net 4.5) があります。このサービスは次のように宣言されます。
<service name="MyService.Service1">
<endpoint address="Try1" behaviorConfiguration="restfulBehvaiour"
binding="webHttpBinding" contract="MyService.IService1" />
<endpoint address="Try2" behaviorConfiguration="restfulBehvaiour"
binding="webHttpBinding" contract="MyService.ITry" />
</service>
...
<behavior name="restfulBehvaiour">
<webHttp helpEnabled="true" />
</behavior>
例外をjsonとして返そうとしています。http://zamd.net/2008/07/08/error-handling-with-webhttpbinding-for-ajaxjson/のチュートリアルに従いました。
要するに:
1)svcファイルにこれを追加しました(両方のインターフェースを実装しています)
<%@ ServiceHost Language="C#" Debug="true" Service="MyService.Service1" CodeBehind="Service1.svc.cs" Factory="MyService.CustomWebServiceHostFactory"%>
2) CustomWebServiceHostFactory の場所
public class CustomWebServiceHostFactory : System.ServiceModel.Activation.WebServiceHostFactory
{
public override ServiceHostBase CreateServiceHost(string constructorString, Uri[] baseAddresses)
{
var sh = new ServiceHost(typeof(Service1), baseAddresses);
sh.Description.Endpoints[0].Behaviors.Add(new CustomWebHttpBehavior());
return sh;
}
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
return base.CreateServiceHost(serviceType, baseAddresses);
}
3) カスタム CustomWebHttpHandler は
protected override void AddServerErrorHandlers(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{
// clear default error handlers.
endpointDispatcher.ChannelDispatcher.ErrorHandlers.Clear();
// add our own error handler.
endpointDispatcher.ChannelDispatcher.ErrorHandlers.Add(new ErrorHandlerEx());
}
4) ErrorHandlerEx は、例外を処理するクラスです (json オブジェクトを返します)。
これは最初のエンドポイント (Try1) ではうまく機能しますが、2 番目のエンドポイント (Try2) は無視され、CustomWebServiceHostFactry をスローしません。
web.config でエンドポイントの順序を切り替えると、最初のエンドポイントが常に機能し、2 番目の例外はデフォルトの wcf ハンドラーによって処理されます。
上記のチュートリアルが示唆するように、すべてのエンドポイントが機能するように、この動作を修正するにはどうすればよいですか?