Код ошибки или исключение - что является лучшим методом для веб-службы ASP.Net? - PullRequest
2 голосов
/ 17 сентября 2008

Я прочитал эту ветку , потому что в WCF есть встроенные пользовательские коды ошибок и прочее.

Но какова лучшая практика для ASP.Net веб-сервисов? Я выбрасываю исключения и позволяю клиенту обрабатывать исключение или отправляю код ошибки (успех, сбой и т. Д.), На который клиент будет полагаться при обработке.

Обновление: просто для дальнейшего обсуждения в случае SOAP , скажем, клиент выполняет web svc вызов, который должен быть уведомительным сообщением (возвращаемое значение не ожидается), так что все идет гладко, и svc не создает никаких исключений.

Теперь, как клиент узнает, что вызов уведомления потерян из-за проблем со связью / сетью или между сервером и клиентом? Сравните это с тем, чтобы не было исключений. Клиент может предположить, что это успех. Но это не так. Звонок где-то потерялся.

Отправляет ли код ошибки «success» клиенту, чтобы звонок прошел гладко? Есть ли другой способ добиться этого или сценарий выше возможен?

Ответы [ 2 ]

2 голосов
/ 18 сентября 2008

Джефф Этвуд опубликовал интересную статью об этой теме некоторое время назад. Несмотря на то, что исключение .NET преобразуется в SoapFault, который совместим с большинством других наборов инструментов, информация об ошибках не очень хорошая. Поэтому статья состоит в том, что веб-сервисы .NET не выдают очень хорошие сообщения об исключениях, и вам следует добавить дополнительную информацию:

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

Подробнее о том, почему мыло лучше в этом вопросе .

1 голос
/ 17 сентября 2008

Зависит от того, как вы собираетесь использовать веб-службу, т. Е. Какой протокол вы собираетесь использовать.

Если это GET или POST, лучше возвращать код ошибки, так как вызывающий HttpWebRequest (.Net) или другой код получит ошибку сервера и должен будет устранить ее, чтобы извлечь код исключения.

Если это SOAP - тогда вполне нормально генерировать пользовательские исключения (вы не хотите возвращать исключения внутренней структуры, так как они могут показать некоторую трассировку стека и т. Д. Внешним сторонам).

Поскольку веб-службы SOAP в точности предназначены для того, чтобы смотреть на вызывающий код как на обычный вызов метода, соответствующая вызывающая структура должна уметь обрабатывать и распространять исключение очень хорошо, таким образом заставляя вызывающий код выглядеть и вести себя так, как он работает с внутренними звонками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...