0

我有一个带有一个服务和多个接口\端点的 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),但第二个端点 (Try2) 被忽略并且不会抛出 CustomWebServiceHostFactry。

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

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

4

1 回答 1

0

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

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 回答