Jus*_*ner 2 c# wcf json web-config
希望有一些WCF向导可以在这里发现我的错误.
我试图通过RESTful JSON WCF服务上基于IErrorHandler的behaviorExtension设置全局错误处理程序.该方法装饰如下:
[OperationContract]
[WebGet(UriTemplate = "screens/info", ResponseFormat = WebMessageFormat.Json)]
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
我可以验证(通过断点)正在调用扩展并正在正确执行.当我在浏览器中查看AJAX调用的结果时,我可以看到WCF仍然返回500内部服务器错误,而不是我在错误处理程序中指定的错误详细信息.
如果我更改了在WCF方法中抛出的异常类型,那些会反映在浏览器的结果中,所以我可以推测WCF正在做一些事情来处理异常并在内部返回一些东西.
我如何让它停止!?
编辑
我正在添加自定义行为元素:
public class ErrorBehaviorElement : BehaviorExtensionElement
{
protected override object CreateBehavior()
{
return new ErrorBehavior();
}
public override Type BehaviorType
{
get { return typeof(ErrorBehavior); }
}
}
Run Code Online (Sandbox Code Playgroud)
和行为:
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());
}
}
Run Code Online (Sandbox Code Playgroud)
这里的问题在于WCF Rest Starter Kit(我没有意识到,因为我没有开始这个项目,所以我没有使用它),更具体地说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);
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,不管是什么行为,你想要添加到终点,只要它从WebHttpBehavior继承了休息入门套件的组件将劫持您的处理程序,将其删除,并用自己的替换它.
请记住,WebHttpBehavior2也WebHttBehavior继承WebHttpBehavior2所以继承在我的分机什么也没做,以帮助这件事.
第一步是创建一个新的WebSeriveHost,它源自WebServiceHost2并覆盖OnOpening()并重新劫持Rest Starter Kit从我这里偷走的东西:
if(endpoint.Behaviors.Find<WebHttpBehavior>() != null)
{
endpoint.Behaviors.Remove<WebHttpBehavior>();
var item = ErrorBehavior();
// other code
endpoint.Behaviors.Add(item);
}
Run Code Online (Sandbox Code Playgroud)
然后创建一个返回我的自定义WebServiceHost类型的新WebServiceHostFactory.
| 归档时间: |
|
| 查看次数: |
2676 次 |
| 最近记录: |