2015-10-28 2 views
5

Есть ли способ уловить ошибку HTTP 500, возвращенную веб-службой .asmx от клиента .Net?. Чистый код, чтобы поймать ответ HTTP 500 от веб-службы .asmx

Использование .Net 4.5 (VS2015), код клиента .Net потребляет .asmx веб-службы и называет его, используя код ниже:

var client = new WebserviceApi.MyServiceSoapClient(); 

var response = client.MyWebServiceMethod(); 

Если .asmx веб-сервис возвращает ошибку 500 HTTP с SOAP-сообщение, содержащее данные сообщения об ошибке, для переменной «response» установлено значение null.

Используя Fiddler, трафик показывает ответ HTTP 500 от веб-службы .asmx. Ответ содержит XML-сообщение SOAP с подробными сведениями об ошибке.

Исключение не выбрасывается или не попадает в код клиента .Net, выполнение продолжается как обычно.

Это означает, что клиент не может получить информацию о характере исключения. Весь клиентский код может проверить, является ли «ответ» нулевым, но сообщение об исключении недоступно для кода клиента.

Есть ли способ заставить код клиента .Net генерировать исключение, если веб-служба .asmx возвращает ответ HTTP 500, чтобы можно было проверить/зарегистрировать сообщение об ошибке?

+0

Не можете ли вы поймать Исключение, используя инструкцию 'try cath'? – anmarti

+0

Исключение не выбрасывается, выполнение продолжается как обычно с нулевой переменной «ответ». – Lenny

+0

Итак, откуда вы знаете, что у вас 500? – anmarti

ответ

2

После изучения этого, кажется, что все ошибки, выброшенные из ASMX, представлены в виде класса SoapException, поэтому для его устранения должно быть достаточно уловить попытку с этим классом.

Further reading on ASMX exception handling

SoapException Class

nivlam также propsed хорошее решение для чтения необработанных данных запроса от ASMX и SOAP поверх на this answer и вы могли бы, вероятно, получить коды ошибок там.

+0

К сожалению, в этом случае исключение не выбрасывается, было бы неплохо. – Lenny

+0

@ Lenny try Я добавил второй раздел внизу, он имеет ссылку на ответ nivlam, использует свой метод для чтения исходного вывода и определяет ошибку, которую вы получаете –

4

У меня была аналогичная проблема для веб-службы axis (java). Они бросали исключения, которые не появлялись на моей стороне, хотя ответ был действительно HTTP 500.

Я не могу сказать точно, что это решит ваше дело, но я решил, что я переопределяю метод GetWebResponse и бросаю исключение самостоятельно, когда это необходимо.

Я сделал это, изменив код клиента веб-сервиса, сгенерированный Visual Studio, после добавления веб-ссылки (сгенерированное имя файла: Reference.cs, иногда оно не отображается в решении, вам нужно нажать «Показать все файлы» сверху в области решения, а затем развернуть свои справочные файлы веб-службы.

internal class ChangedWebServiceClient : SomeSoapService 
{ 

    protected override WebResponse GetWebResponse(WebRequest request) 
    { 
     var response = base.GetWebResponse(request); 

     if (response != null) 

     { 
      var responseField = response.GetType().GetField("_base", BindingFlags.Instance | BindingFlags.NonPublic); 
      if (responseField != null) 
      { 
       var webResp = responseField.GetValue(response) as HttpWebResponse; 
       if (webResp != null) 
       { 
        if (webResp.StatusCode.Equals(HttpStatusCode.InternalServerError)) 
         throw new WebException(
          "HTTP 500 - Internal Server Error happened here. Or any other message that fits here well :)"); 
       } 
      } 
     } 

     return response; 
    } 
} 
0

у меня была аналогичная проблема несколько лет назад. проблема с кодом состояния HTTP 500 является то, что вызов службы не доходит до сервера. Таким образом, вы не можете отлаживать его. Решение, которое сработало для меня, было , убедившись, что параметры имеют ту же схему, что и для веб-методов, определенных. Любое несоответствие в контрактах данных может вызвать ошибку внутреннего сервера HTTP 500.

Смежные вопросы