【问题标题】:Custom Error Handling message for Custom WebServiceHost自定义 WebServiceHost 的自定义错误处理消息
【发布时间】:2010-10-04 13:20:55
【问题描述】:

我有一个自定义 WCF 服务主机 (webServicehost2) 和工厂正在执行一些依赖注入(实现自定义 IInstanceProvider)以及一些自定义身份验证(实现自定义 RequestInterceptor)。

当我导航到不存在的 REST 资源时,我遇到了一个非常小的问题。 例如

http://localhost/restservice.svc/
http://localhost/restservice.svc/blah/

我收到了404 Error,这是意料之中的。

我想知道的是,无论如何我可以捕获返回的 Http 错误并将其格式化。

【问题讨论】:

    标签: .net wcf rest


    【解决方案1】:

    我不确定是否有更简单的方法,但我在这里做了一些快速原型设计,发现实现此目的的一种方法是添加一个自定义 IDispatchMessageInspector 实现,该实现查看服务的响应消息并替换内容使用您自己的自定义 HTML 页面。

    基本上是这样的:

    • 实现 IDispatchMessageInspector.BeforeSendReply()
    • 查看回复信息,抓取httpResponse属性,根据StatusCode属性判断是否有错误。
    • 如果出现错误,请创建一个全新的 WCF 消息,并将正文设置为您要提供的 HTML 内容。
    • 再次将 httpResponse 和 webBodyFormatMessageProperty 属性添加到新消息并将其设置为回复。

    我的样本可以成功地做到这一点,但它很难看;在发布之前我需要清理一下。

    【讨论】:

      【解决方案2】:

      以下是其他尝试此操作的其他人的相关代码片段

      首先是IDispatchMessageInspector的实例

       public class CustomResponseFormatterMessageInspector : IDispatchMessageInspector
          {
              public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
              {
                  return null;
              }
      
              public void BeforeSendReply(ref Message reply, object correlationState)
              {
                  var prop = (HttpResponseMessageProperty)reply.Properties[HttpResponseMessageProperty.Name];
                  if (prop.StatusCode == HttpStatusCode.NotFound)
                  {
                      ErrorResponse(ref reply);
                  }
              }
      
              private void ErrorResponse(ref Message original)
              {
                  const string ERROR_HTML = @"<html><HEAD><TITLE>Request Error</TITLE></HEAD><BODY> <H1>My Error processing request {1}</H1><P>{0}</P></BODY></html>";
      
                  XElement response = XElement.Load(new StringReader(string.Format(ERROR_HTML, "A Resource does not exsist at this location.", HttpStatusCode.NotFound)));
                  Message reply = Message.CreateMessage(original.Version, null, response);
                  reply.Headers.CopyHeadersFrom(original);
                  reply.Properties.CopyProperties(original.Properties);
                  original = reply;
              }
          }
      

      然后将其注入我添加的IServiceBehaviour

      ed.DispatchRuntime.MessageInspectors.Add(new CustomResponseFormatterMessageInspector());
      

      其中可能还有其他与我的实现相关的代码,但这就是我添加的全部内容。

       public class DependencyInjectionServiceBehavior : IServiceBehavior
          {
              public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
              {
                  foreach (ChannelDispatcherBase cdb in serviceHostBase.ChannelDispatchers)
                  {
                      var cd = cdb as ChannelDispatcher;
                      if (cd != null)
                      {
                          foreach (EndpointDispatcher ed in cd.Endpoints)
                          {
                              ed.DispatchRuntime.InstanceProvider =
                                  new DependencyInjectionInstanceProvider(serviceDescription.ServiceType);
                              ed.DispatchRuntime.MessageInspectors.Add(new CustomResponseFormatterMessageInspector());
                          }
                      }
                  }
              }
      
              public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
              {
              }
      
              public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
              {
              }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-14
        • 2016-09-03
        • 2017-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-21
        • 2011-04-27
        相关资源
        最近更新 更多