希望有一些WCF嚮導可以在這裏發現我的錯誤。WCF IErrorHandler擴展沒有返回指定的錯誤
我正在嘗試通過基於IErrorHandler的RESTful JSON WCF服務上的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());
}
}
如何將新的錯誤處理程序添加到服務中? – 2010-09-13 19:13:02
@Ladislav - 通過web.config自定義BehaviorExtensionElement – 2010-09-13 19:22:16
是的,我明白,但我對你的自定義行爲感興趣。 – 2010-09-13 19:37:28