当前位置:  开发笔记 > 编程语言 > 正文

WCF IErrorHandler扩展未返回指定的Fault

如何解决《WCFIErrorHandler扩展未返回指定的Fault》经验,为你挑选了1个好方法。

希望有一些WCF向导可以在这里发现我的错误.

我试图通过RESTful JSON WCF服务上基于IErrorHandler的behaviorExtension设置全局错误处理程序.该方法装饰如下:

[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;
    }
}

我可以验证(通过断点)正在调用扩展并正在正确执行.当我在浏览器中查看AJAX调用的结果时,我可以看到WCF仍然返回500内部服务器错误,而不是我在错误处理程序中指定的错误详细信息.

如果我更改了在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());
    }  
}

Justin Niess.. 5

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

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

正如你所看到的,不管是什么行为,你想要添加到终点,只要它从WebHttpBehavior继承了休息入门套件的组件将劫持您的处理程序,将其删除,并用自己的替换它.

请记住,WebHttpBehavior2也WebHttBehavior继承WebHttpBehavior2所以继承在我的分机什么也没做,以帮助这件事.

第一步是创建一个新的WebSeriveHost,它源自WebServiceHost2并覆盖OnOpening()并重新劫持Rest Starter Kit从我这里偷走的东西:

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

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



1> Justin Niess..:

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

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

正如你所看到的,不管是什么行为,你想要添加到终点,只要它从WebHttpBehavior继承了休息入门套件的组件将劫持您的处理程序,将其删除,并用自己的替换它.

请记住,WebHttpBehavior2也WebHttBehavior继承WebHttpBehavior2所以继承在我的分机什么也没做,以帮助这件事.

第一步是创建一个新的WebSeriveHost,它源自WebServiceHost2并覆盖OnOpening()并重新劫持Rest Starter Kit从我这里偷走的东西:

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

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

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有