Código de erro ou exceção – qual é a melhor prática para um serviço web ASP.Net?

StackOverflow https://stackoverflow.com/questions/78064

  •  09-06-2019
  •  | 
  •  

Pergunta

Eu li isso fio para WCF possui códigos de falha personalizados integrados e outras coisas.

Mas qual é a melhor prática para ASP.Net serviços web?Lanço exceções e deixo o cliente lidar com a exceção ou envio um código de erro (sucesso, falha etc.) no qual o cliente confiaria para fazer seu processamento.

Atualizar:Apenas para discutir mais em caso de SABÃO, digamos que o cliente faça um web svc chamada que deveria ser uma mensagem de notificação (nenhum valor de retorno esperado), então tudo corre bem e nenhuma exceção é lançada pelo svc.

Agora, como o cliente saberá se a chamada de notificação foi perdida devido a um problema de comunicação/rede ou algo entre o servidor e o cliente?compare isso com não ter nenhuma exceção lançada.O cliente pode presumir que foi um sucesso.Mas isso não.A ligação se perdeu em algum lugar.

O envio de um código de erro de 'sucesso' garante ao cliente que a chamada ocorreu sem problemas?existe alguma outra maneira de conseguir isso ou o cenário acima é possível?

Foi útil?

Solução

Jeff Atwood postou um artigo interessante sobre esse assunto há algum tempo.Embora uma exceção .NET seja convertida em SoapFault, que é compatível com a maioria dos outros kits de ferramentas, as informações nas falhas não são muito boas.Portanto, a conclusão do artigo é que os webservices .NET não lançam mensagens de exceção muito boas e você deve adicionar informações adicionais:

Private Sub WebServiceExceptionHandler(ByVal ex As Exception)
    Dim ueh As New AspUnhandledExceptionHandler
    ueh.HandleException(ex)

    '-- Build the detail element of the SOAP fault.
    Dim doc As New System.Xml.XmlDocument
    Dim node As System.Xml.XmlNode = doc.CreateNode(XmlNodeType.Element, _
        SoapException.DetailElementName.Name, _
        SoapException.DetailElementName.Namespace)

    '-- append our error detail string to the SOAP detail element
    Dim details As System.Xml.XmlNode = doc.CreateNode(XmlNodeType.Element, _
        "ExceptionInfo", _
        SoapException.DetailElementName.Namespace)
    details.InnerText = ueh.ExceptionToString(ex)
    node.AppendChild(details)

    '-- re-throw the exception so we can package additional info
    Throw New SoapException("Unhandled Exception: " & ex.Message, _
        SoapException.ClientFaultCode, _
        Context.Request.Url.ToString, node)
End Sub

Mais informações por que os soapfaults são melhores nesta questão.

Outras dicas

Depende de como você consumirá o serviço da web - ou seja,qual protocolo você vai usar.

Se for GET ou POST, é melhor retornar o código de erro, pois o código de chamada HttpWebRequest (.Net) ou outro código receberá erro do servidor e terá que lidar com ele para extrair o código de exceção.

Se for SOAP - então é perfeitamente aceitável lançar exceções personalizadas (você não deseja retornar exceções da estrutura interna, pois elas podem revelar algum rastreamento de pilha, etc.para partes externas).

Como os serviços da web SOAP são exatamente destinados a considerar o código de chamada como uma chamada de método normal, a estrutura de chamada correspondente deve ser capaz de manipular e propagar a exceção perfeitamente, fazendo com que o código de chamada pareça e se comporte como lida com chamadas internas .

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