wcf CustomWebHttpBehavior 仅适用于第一个端点

wcf CustomWebHttpBehavior works only on the first endpoint

我有一个包含一项服务和多个 interfaces\end 点的 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>

我正在尝试 return 任何异常 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 是一些 class 处理异常(returns json 对象)。

这对第一个端点 (Try1) 非常有用,但第二个端点 (Try2) 被忽略了,不会抛出 CustomWebServiceHostFactry。

如果我在 web.config 中切换端点的顺序,第一个始终有效,第二个异常由默认的 wcf 处理程序处理。

我该如何解决这个问题,以便每个端点都能按照上述教程的建议工作?

您只在自定义服务主机的一个端点(第一个端点)上实施行为。

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

Endpoints[0] 是集合中的第一个端点。您需要将它添加到服务的两个(或所有,如果您有超过 2 个)端点。我推荐一个 foreach 循环:

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

这应该可以解决该行为仅应用于第一个端点的问题。