If something goes wrong in a WCF REST call, such as the requested resource is not found, how can I play with the HTTP response code (setting it to something like HTTP 404, for example) in my OperationContract method?
-
ok all the answers to this assume control made it into your service implementation. what if they pass some totally invalid uri? how are you suppose to provide a 404 for all the unexpected hits to your service?Nathan Tregillus– Nathan Tregillus2012-07-18 22:56:56 +00:00Commented Jul 18, 2012 at 22:56
7 Answers
There is a WebOperationContext that you can access and it has a OutgoingResponse property of type OutgoingWebResponseContext which has a StatusCode property that can be set.
WebOperationContext ctx = WebOperationContext.Current;
ctx.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK;
2 Comments
WebFaultException, however, does seem to work.If you need to return a reason body then have a look at WebFaultException
For example
throw new WebFaultException<string>("Bar wasn't Foo'd", HttpStatusCode.BadRequest );
4 Comments
WebFaultException to return an HttpStatusCode.Created?For 404 there is a built in method on the WebOperationContext.Current.OutgoingResponse called SetStatusAsNotFound(string message) that will set the status code to 404 and a status description with one call.
Note there is also, SetStatusAsCreated(Uri location) that will set the status code to 201 and location header with one call.
1 Comment
You can also return a statuscode and reason body with WebOperationContext's StatusCode and StatusDescription:
WebOperationContext context = WebOperationContext.Current;
context.OutgoingResponse.StatusCode = HttpStatusCode.OK;
context.OutgoingResponse.StatusDescription = "Your Message";
Comments
If you wish to see the status description in the header, REST method should make sure to return null from the Catch() section as below:
catch (ArgumentException ex)
{
WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.InternalServerError;
WebOperationContext.Current.OutgoingResponse.StatusDescription = ex.Message;
return null;
}
1 Comment
WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.Unauthorized;
throw new WebException("令牌码不正确", new InvalidTokenException());
Comments
This did not work for me for WCF Data Services. Instead, you can use DataServiceException in case of Data Services. Found the following post useful. http://social.msdn.microsoft.com/Forums/en/adodotnetdataservices/thread/f0cbab98-fcd7-4248-af81-5f74b019d8de