Qual é a melhor maneira de retornar erros de um serviço WCF de forma RESTful?
-
03-07-2019 - |
Pergunta
Usando WCF de forma RESTful parece ótimo. Eu sou um grande fã dos grandes armas como a simplicidade e flexibilidade, mas eu também adoro a forma como as URLs acabam procurando. O que posso dizer, eu sou um programador.
A API simples para recuperar e editar recursos é acompanhada por um conjunto de quase igualmente simples de possíveis respostas de erro, e eu não posso deixar de sentir que, para manter a uma abordagem RESTful “puro” I pode ser cortar o nariz fora a despeito pelo rosto, ou mais especificamente, o nariz dos meus consumidores de serviços web. Eu posso estar errado, mas não parece ser muito muitos códigos de erro HTTP que eu posso usar, e há maneiras de passar de volta uma mensagem de erro personalizada.
Para esclarecer, eu estou falando sobre erros excepcionais adequados e erros não esperados. Eu quero realmente comunicar um problema para o usuário para ajudá-los a identificar o que eles precisam fazer para corrigi-lo.
As opções possíveis Estou pensando ...
-
Apenas usam o protocolo HTTP códigos de erro - Este parecer como ele seria demasiado restritiva no que eu sou capaz de expressar, e não vai permitir-me para fornecer uma mensagem personalizada. Por favor (!), Me corrija se eu estiver errado.
-
sempre retorno Http sucesso, mas personalizado retorno de erro objetos -. Obviamente o mais flexível, mas certamente não é o mais RESTful
Eu realmente aprecio isso se alguém poderia compartilhar alguma experiência do mundo real deste problema particular.
Atualização
Obrigado pela sugestão de usar a propriedade StatusDescription
do objeto OutgoingWebResponseContext
. Parecia a primeira a ser algo que eu poderia usar.
Eu vim à conclusão de que a minha segunda opção acima não é para mim. Eu quero ficar com o que Http pode me dar.
Estou tendo problemas fazê-la funcionar, no entanto. Independentemente do fornecimento de valor I para esta propriedade, ele não é retornado na resposta.
O meu método de serviços olhares como este
public MyType GetMyTypes(string criteria)
{
try
{
return GetMyTypes();
}
catch (Exception ex)
{
OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse;
response.StatusCode = HttpStatusCode.Forbidden;
response.StatusDescription = "A Big fat error occurred";
return null;
}
}
E aqui está a mensagem de resposta cru. Não há menção da mensagem personalizada ...
HTTP / 1.1 403 Forbidden
Servidor: ASP.NET Development Server / 9.0.0.0
Data: Wed, 07 janeiro de 2009 14:01:20 GMT
X-ASPNet-Versão: 2.0.50727
Cache-Control:
privada Content-Length: 0
Connection: Close
Não é como se eu só precisa acessar a propriedade correta no cliente. A informação é simplesmente não está sendo enviado através do link.
O que esta propriedade StatusDescription
realmente fazer?
Atualização
Eu nunca consegui descobrir como definir a propriedade StatusDescription. Acabei não incluindo qualquer mensagem de erro em tudo, e ir apenas com os códigos de status HTTP. Eu escolhi para expor tanto Sabão e endpoints de descanso para os meus serviços, e assim os clientes podem escolher qual eles preferem usar -. As mensagens Restful simples ou as mensagens relativamente mais rica de sabão
Solução
Enviar o código de resposta adequada e você pode fornecer a mensagem de erro personalizada no corpo da resposta.
Outras dicas
Com .net 4, jogar um WebFaultException<T>
(T errorDetail,
HttpResponseCode
code)
Aqui você define o seu tipo de resposta a um outro tipo de objeto, o que faz sentido, e também definir o ResponseCode
que você deseja.
O errorDetail
deve ser serializado
eu adicionar o código de erro tanto como acima (na descrição de status) e no corpo da página devolvida em meus serviços REST como:
OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse;
response.StatusCode = HttpStatusCode.Unauthorized;
response.StatusDescription = "You are not authorized.";
HttpContext.Current.Response.Write("You are not authorized.");
return null;
esta discussão para uma pergunta semelhante.
Em poucas palavras eu acredito que você pode definir o código de status HTTP (para um dos códigos de erro), e fornecer a sua mensagem personalizada na StatusDescription propriedade:
OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse;
response.StatusCode = System.Net.HttpStatusCode.Forbidden;
response.StatusDescription = "Custom";
Eu não sei muito sobre a prevalência desta técnica no mundo real, infelizmente.
Este pode ser um defeito. A partir de 2011/09/22, a questão está em análise pela equipe de produto: