На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> WCF, Отчёт об ошибках десериализации парметров вызова
    Есть WCF-служба, работает по SOAP (wsHttpBinding). В ней есть метод, он принимает параметр сложного типа. На этот тип повешан DataContract. Всё работает.
    ExpandedWrap disabled
      [ServiceContract()]
      public interface IPublicService
      {
          [OperationContract]
          Boolean DoSomething(Parameter obj);
      }


    Проблема возникает, когда клиент шлёт службе SOAP-сообщение (по HTTP), в теле которого неверно задан этот параметр. Лишнее поле там в нём или опечатка какая.
    В этом случае клиент сразу получает "The remote server returned an error: (500) Internal Server Error." на свой веб-запрос. При этом в трейсе сервера видно вполне вменяемое исключение:

    Цитата

    <ExceptionType>System.ServiceModel.Dispatcher.NetDispatcherFaultException, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType>
    <Message>The formatter threw an exception while trying to deserialize the message: There was an error while trying to deserialize parameter obj. The InnerException message was 'There was an error deserializing the object of type Parameter. Start element 'a:Name' does not match end element 'obj'. Line 33, position 9.'. Please see InnerException for more details.</Message>

    ... тут ещё трейс, и все внутренние исключения ...

    (в SOAP задано лишнее поле Name)

    Я бы хотел, чтобы клиент таки увидел это сообщение и знал как исправиться. А он видит только HTTP 500...

    "IncludeExceptionDetailInFaults = true" не помогает. Как я понимаю, это только для исключений, который возникают в коде службы.
    Как жить то?
    Сообщение отредактировано: Alexus -
      Если сервис хоститься на IIS и ASP.Net life cycle ему не чужд - можно попробовать в global.asax.cs - на событие "Application_Error" - подправить Response...
      что-то вроде:

      ExpandedWrap disabled
        protected void Application_Error(object sender, EventArgs e)
        {
            Exception ex = Server.GetLastError();
         
         
            HttpContext.Current.Response."На что с душой договорились";
        }


      а в клиенте соотв. это дело чекать (что и как чекать - дело договоренностей сервера и клиента).
      Сообщение отредактировано: Mustang -
        Ой! забыл закрыть запрос. я решил проблему - просто надо было заглянуть в body http-ответа. там лежали всё отчёты об ошибках нужные.
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0262 ]   [ 16 queries used ]   [ Generated: 19.03.24, 09:42 GMT ]