I have a RESTful WCF service and I’ve implemented an ErrorHandler such as the following:
public class MyErrorHandler : IErrorHandler, IServiceBehavior
{
// OMITTED: IServiceBehavior Members
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
DoSomeCustomLogging(error);
WebOperationContext ctx = WebOperationContext.Current;
ctx.OutgoingResponse.StatusCode = HttpStatusCode.InternalServerError;
}
}
public class MyErrorHandlerElement : BehaviorExtensionElement
{
protected override object CreateBehavior()
{
return new MyErrorHandler();
}
public override Type BehaviorType
{
get
{
return typeof(MyErrorHandler);
}
}
}
It’s hooked up in my web.config like so:
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="Rest">
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
<extensions>
<behaviorExtensions>
<add name ="errorHandler" type="ACME.MyErrorHandlerElement, ACME.MyErrorHandler"/>
</behaviorExtensions>
</extensions>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
<standardEndpoints>
<webHttpEndpoint>
<standardEndpoint name="" faultExceptionEnabled="false" helpEnabled="false" automaticFormatSelectionEnabled="true" />
</webHttpEndpoint>
</standardEndpoints>
</system.serviceModel>
For some reason, if my service throws an exception, 400 is returned to the client instead of 500. Any ideas why?
You need to modify the fault that gets passed in by reference, this isnt your regular webmethod call.
MSDN Source