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?
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
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.
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?
Respostas:
Existe um
WebOperationContext
que você pode acessar e tem umaOutgoingResponse
propriedade do tipoOutgoingWebResponseContext
que tem umaStatusCode
propriedade que pode ser definida.fonte
WebFaultException
, no entanto, parece funcionar.Se você precisar retornar um corpo de motivo, dê uma olhada em WebFaultException
Por exemplo
fonte
WebFaultException
para retornar umHttpStatusCode.Created
?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.
fonte
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:
fonte
Você também pode retornar um código de status e um corpo de motivo com StatusCode e StatusDescription de WebOperationContext :
fonte
ref: https://social.msdn.microsoft.com/Forums/en-US/f6671de3-34ce-4b70-9a77-39ecf5d1b9c3/weboperationcontext-http-statuses-and-exceptions?forum=wcf
fonte
Isso não funcionou para mim para o WCF Data Services. Em vez disso, você pode usar DataServiceException no caso de Data Services. Achei a seguinte postagem útil. http://social.msdn.microsoft.com/Forums/en/adodotnetdataservices/thread/f0cbab98-fcd7-4248-af81-5f74b019d8de
fonte