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());
}
这应该可以解决该行为仅应用于第一个端点的问题。
我有一个包含一项服务和多个 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());
}
这应该可以解决该行为仅应用于第一个端点的问题。