Como posso retornar um código de status HTTP personalizado de um método WCF REST?

88

Se algo der errado em uma chamada WCF REST, como o recurso solicitado não for encontrado, como posso brincar com o código de resposta HTTP (configurando-o para algo como HTTP 404, por exemplo) em meu método OperationContract?

kgriffs
fonte
ok todas as respostas a isso assumem o controle feito na implementação do serviço. e se eles passarem algum uri totalmente inválido? como você deve fornecer um 404 para todos os acessos inesperados ao seu serviço?
Nathan Tregillus

Respostas:

111

Existe um WebOperationContextque você pode acessar e tem uma OutgoingResponsepropriedade do tipo OutgoingWebResponseContextque tem uma StatusCodepropriedade que pode ser definida.

WebOperationContext ctx = WebOperationContext.Current;
ctx.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK;
Eric Schoonover
fonte
5
Isso funciona dentro do WCF Data Services - Service Operations? Não tive sorte, parece que o StatusCode que configurei foi superado por outra coisa. Portanto, em todas as solicitações HTTP POST, recebo 204, independentemente de ter definido como 201, etc.
RyBolt
1
Não funciona no meu caso, o status é sobrescrito. Jogar um WebFaultException, no entanto, parece funcionar.
Josh M.
73

Se você precisar retornar um corpo de motivo, dê uma olhada em WebFaultException

Por exemplo

throw new WebFaultException<string>("Bar wasn't Foo'd", HttpStatusCode.BadRequest );
Graeme Bradbury
fonte
4
Gosto mais deste do que do aceito, pois não estamos usando o WebOperationContext.Current
Noel Abrahams
tenha em mente que isso só é válido desde famework 4 msdn.microsoft.com/en-us/library/dd989924.aspx
sebagomez
hmm, no .NET 4.5.1 isso não está definindo o código de status para mim, ainda estou recebendo um 200. Estou usando jsonp, está chamando meu retorno de chamada (em javascript) e passando minha mensagem e meu código de status como um inteiro.
Shavais
4
Isso parece ótimo para qualquer coisa fora dos códigos 2XX, mas você jogaria um WebFaultExceptionpara retornar um HttpStatusCode.Created?
final de
23

Para 404, há um método integrado em WebOperationContext.Current.OutgoingResponse chamado SetStatusAsNotFound (mensagem de string) que definirá o código de status para 404 e uma descrição do status com uma chamada.

Observe que também há SetStatusAsCreated (local Uri) que definirá o código de status para 201 e o cabeçalho do local com uma chamada.

JarrettV
fonte
É preferível ao método exibido na resposta aceita?
final de
2

Se você deseja ver a descrição do status no cabeçalho, o método REST deve se certificar de retornar nulo da seção Catch () conforme abaixo:

catch (ArgumentException ex)
{
    WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.InternalServerError;
    WebOperationContext.Current.OutgoingResponse.StatusDescription = ex.Message;
    return null;
}
Hydtechie
fonte
1
Isso também não funcionou para mim, ainda recebo 200. Estou usando WebHttpBinding com crossDomainScriptAccessEnabled = "true" e um comportamento de ponto final de webHttp com um estilo de corpo padrão de empacotado e um formato de resposta de saída padrão de json. mas isso não deveria importar, deveria?
Shavais