WCF Rest service error handling & WebChannelFactory
rest, wcf, webchannelfactory
Solution
`WebChannelFactory` or `ChannelFactory` will only disclose to you the generic `CommunicationException`. You will need to use a `IClientMessageInspector` behavior or rely on `WebRequest` to return the actual error.
For the `IClientMessageInspector` approach - see the comments in this blog entry.
For the `WebRequest` approach, you can you the following to catch the `WebException`.
try { }
catch (Exception ex)
{
if (ex.GetType().IsAssignableFrom(typeof(WebException)))
{
WebException webEx = ex as WebException;
if (webEx.Status == WebExceptionStatus.ProtocolError)
{
using (StreamReader exResponseReader = new StreamReader(webEx.Response.GetResponseStream()))
{
string exceptionMessage = exResponseReader.ReadToEnd();
Trace.TraceInformation("Internal Error: {0}", exceptionMessage);
}
}
}
}
Problem
From my understanding the following should properly throw a custom error from a WCF Rest service: ``` [DataContract(Namespace = "")] public class ErrorHandler { [DataMember] public int errorCode { get; set; } [DataMember] public string errorMessage { get; set; } } // End of ErrorHandler public class Implementation : ISomeInterface { public string SomeMethod() { throw new WebFaultException<ErrorHandler>(new ErrorHandler() { errorCode = 5, errorMessage = "Something failed" }, System.Net.HttpStatusCode.BadRequest); } } ``` In Fiddler this seems to work, I get the following raw data: ``` HTTP/1.1 400 Bad Request Cache-Control: private Content-Length: 145 Content-Type: application/xml; charset=utf-8 Server: Microsoft-IIS/7.5 X-AspNet-Version: 4.0.30319 Set-Cookie: ASP.NET_SessionId=gwsy212sbjfxdfzslgyrmli1; path=/; HttpOnly X-Powered-By: ASP.NET Date: Thu, 03 May 2012 17:49:14 GMT <ErrorHandler xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><errorCode>5</errorCode><errorMessage>Something failed</errorMessage></ErrorHandler> ``` But now on my client side I have the following code: ``` WebChannelFactory<ISomeInterface> client = new WebChannelFactory<ISomeInterface>(new Uri(targetHost)); ISomeInterface someInterface = client.CreateChannel(); try { var result = someInterface.SomeMethod(); } catch(Exception ex) { // Try to examine the ErrorHandler to get additional details. } ``` Now when the code runs, it hits the catch and is a `System.ServiceModel.ProtocolException` with the message 'The remote server returned an unexpected response: (400) Bad Request.'. It seems that I have no way to see the ErrorHandler details at this point. Has anyone run into this? Is there a way I can get the ErrorHander details at this point?