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?


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;

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 );

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.


É 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;
}

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



Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.