【发布时间】:2010-09-13 17:56:13
【问题描述】:
希望有一些 WCF 向导可以在这里发现我的错误。
我正在尝试通过基于 IErrorHandler 的 behaviorExtension 在 RESTful JSON 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;
}
}
我可以验证(通过断点)扩展正在被调用并且正在正确执行。当我在浏览器中查看 AJAX 调用的结果时,我可以看到 WCF 仍然返回 500 Internal Server Error 而不是我在错误处理程序中指定的故障详细信息。
如果我更改 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());
}
}
【问题讨论】:
-
如何将新的错误处理程序添加到服务中?
-
@Ladislav - 通过带有自定义 BehaviorExtensionElement 的 web.config
-
是的,我明白这一点,但我对您的自定义行为感兴趣。
-
@Ladislav - 我刚刚添加了所涉及的其余代码。
-
您是在普通的 XmlHttpRequest / jQuery 中还是在 ASP.NET AJAX / ScriptManager 中使用服务?
标签: c# wcf json web-config