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 ...

  1. 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.

  2. 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

Foi útil?

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

http://blogs.msdn.com/b/endpoint/archive/2010/01/21/error-handling-in-wcf-webhttp-services-with-webfaultexception.aspx

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:

http://connect.microsoft.com/VisualStudio/feedback/details/690162/wcf-rest-custom-outgoingwebresponsecontext-statusdescription-not-returned-in-response

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top