代码之家  ›  专栏  ›  技术社区  ›  Justin Niessner

WCF IErrorHandler扩展未返回指定的错误

  •  2
  • Justin Niessner  · 技术社区  · 14 年前

    希望有一些WCF奇才可以在这里发现我的错误。

    [OperationContract]
    [WebGet(UriTemplate = "screens/info", ResponseFormat = WebMessageFormat.Json)]
    

    IErrorHandler实现是:

    public class ErrorHandler : IErrorHandler
    {
        public void ProvideFault(Exception error, 
                                 MessageVersion version, 
                                 ref Message fault)
        {
            var error = new JsonError 
                            { 
                                Message = error.Message, 
                                FaultCode = -1, 
                                StackTrace = error.StackTrace
                            };
    
            fault = Message.CreateMessage(version, 
                        "", 
                        ideaScreeningError, 
                        new DataContractJsonSerializer(
                            ideaScreeningError.GetType()));
    
            // tell WCF to use JSON encoding rather than default XML
            var wbf = new WebBodyFormatMessageProperty(WebContentFormat.Json);
            fault.Properties.Add(WebBodyFormatMessageProperty.Name, wbf);
    
            //Modify response
            var rmp = new HttpResponseMessageProperty 
                          { 
                              StatusCode = HttpStatusCode.BadRequest, 
                              StatusDescription = "Bad Request"
                          };
    
            fault.Properties.Add(HttpResponseMessageProperty.Name, rmp);
        }
    
        public bool HandleError(Exception error)
        {
            return true;
        }
    }
    

    如果我更改WCF方法中抛出的异常类型,这些异常类型会反映在浏览器的结果中,因此我可以推测WCF正在处理异常并在内部返回某些内容。

    编辑

    我正在添加自定义行为元素:

    public class ErrorBehaviorElement : BehaviorExtensionElement
    {
        protected override object CreateBehavior()
        {
            return new ErrorBehavior();
        }
    
        public override Type BehaviorType
        {
            get { return typeof(ErrorBehavior); }
        }
    }
    

    和行为:

    internal class ErrorBehavior : WebHttpBehavior
    {
        protected override void AddServerErrorHandlers(ServiceEndpoint endpoint,
            EndpointDispatcher endpointDispatcher)
        {
            // clear default error handlers.  
            endpointDispatcher.ChannelDispatcher.ErrorHandlers.Clear();
    
            // add the Json error handler.  
            endpointDispatcher.ChannelDispatcher.ErrorHandlers.Add(
                new ErrorHandler());
        }  
    }
    
    3 回复  |  直到 14 年前
        1
  •  5
  •   Justin Niessner    14 年前

    这里的问题在于WCF Rest初学者工具包(因为我没有启动这个项目,所以我没有意识到它正在使用),更具体地说 WebServiceHost2 . 我在Reflector中打开ServiceHost,在中发现了这段可爱的小代码 OnOpening() :

    if (endpoint.Behaviors.Find<WebHttpBehavior>() != null)
    {
        endpoint.Behaviors.Remove<WebHttpBehavior>();
        WebHttpBehavior2 item = new WebHttpBehavior2();
        // other code omitted
        endpoint.Behaviors.Add(item);
    }
    

    请记住,WebHttpBehavior2也从WebHttBehavior继承,因此在我的扩展中从WebHttpBehavior2继承对这个问题没有任何帮助。

    第一步是创建一个从 WebService主机2 打开()

    if(endpoint.Behaviors.Find<WebHttpBehavior>() != null)
    {
        endpoint.Behaviors.Remove<WebHttpBehavior>();
        var item = ErrorBehavior();
        // other code
        endpoint.Behaviors.Add(item);
    }
    

    然后创建一个返回自定义WebServiceHost类型的新WebServiceHostFactory。

        2
  •  0
  •   Johann Blais    14 年前

    rmp.Headers[HttpResponseHeader.ContentType] = "application/json";
    
        3
  •  0
  •   Ladislav Mrnka    14 年前

    基于评论,我会尝试删除常见的webHttpBehavior。您已经定义了自己从webHttp派生的行为。没有理由在服务配置中有两个webHttp行为。此外,webHttp行为添加了自己的错误处理程序,其行为与您描述的完全相同。也许没用,但你可以试试。