0

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 ハンドラーによって処理されます。

上記のチュートリアルが示唆するように、すべてのエンドポイントが機能するように、この動作を修正するにはどうすればよいですか?

4

1 に答える 1

0

カスタム サービス ホストの 1 つのエンドポイント (最初のエンドポイント) にのみ動作を実装します。

sh.Description.Endpoints[0].Behaviors.Add(new CustomWebHttpBehavior());

Endpoints[0]コレクション内の最初のエンドポイントです。サービスの両方 (2 つ以上ある場合はすべて) のエンドポイントに追加する必要があります。foreachループをお勧めします:

foreach (ServiceEndpoint endpoint in sh.Description.Endpoints)
{
    endpoint.Behaviors.Add(new CustomWebHttpBehavior());
}

これにより、動作が最初のエンドポイントにのみ適用されるという問題が解決されます。

于 2015-04-21T15:10:52.167 に答える