2015-10-28 8 views
5

Czy istnieje sposób na wychwycenie błędu HTTP 500 zwróconego przez usługę internetową .asmx z klienta .Net?. Kod sieciowy do przechwytywania odpowiedzi o błędzie HTTP 500 z usługi internetowej .asmx.

Korzystanie .Net 4.5 (VS2015), kod klienta Net zużywa usługę .asmx internetową i nazywa je za pomocą poniższego kodu:

var client = new WebserviceApi.MyServiceSoapClient(); 

var response = client.MyWebServiceMethod(); 

Jeśli .asmx serwis internetowy zwraca błąd HTTP 500 z komunikat SOAP zawierający szczegóły komunikatu o błędzie zmienna "response" ma wartość null.

Korzystanie z Fiddler, ruch pokazuje odpowiedź HTTP 500 z usługi internetowej .asmx. Odpowiedź zawiera komunikat XML SOAP ze szczegółami dotyczącymi błędu.

Żaden wyjątek nie został zgłoszony lub przechwycony w kodzie klienta .Net, wykonanie jest normalne.

Oznacza to, że nie ma informacji, które klient mógłby poznać w związku z charakterem wyjątku. Cały kod klienta może zrobić, to sprawdzić, czy "odpowiedź" jest pusta, ale komunikat wyjątku nie jest dostępny dla kodu klienta.

Czy istnieje sposób zmuszenia kodu klienta .Net do zgłoszenia wyjątku, jeśli usługa WWW .asmx zwraca odpowiedź HTTP 500, aby komunikat o błędzie mógł zostać sprawdzony/zalogowany?

+0

Nie możesz złapać wyjątku, używając instrukcji 'try cath'? – anmarti

+0

Nie jest zgłaszany wyjątek, wykonywanie jest normalne z zerową "odpowiedzią". – Lenny

+0

Skąd wiesz, że masz 500? – anmarti

Odpowiedz

2

Po krótkiej analizie wydaje się, że wszystkie błędy generowane przez ASMX mają postać klasy SoapException, więc próba złapania tej klasy powinna wystarczyć do obsłużenia tego błędu.

Further reading on ASMX exception handling

SoapException Class

nivlam propsed także dobre rozwiązanie do czytania surowych danych żądać od ASMX i mydło w ciągu dnia this answer i prawdopodobnie można dostać kody błędów stamtąd.

+0

Niestety w tym przypadku wyjątek nie zostanie rzucony, byłoby jednak miło. – Lenny

+0

@Lenny spróbuj dodać drugą sekcję na dole, ma link do odpowiedzi nivlam, użyj jego metody, aby odczytać nieprzetworzone dane wyjściowe i określić błąd, który otrzymujesz –

4

Miałem podobny problem z serwisem osi (java). Rzucały wyjątki, które nie pojawiały się po mojej stronie, mimo że odpowiedź była naprawdę HTTP 500.

Nie mogę powiedzieć na pewno, że rozwiąże to twoją sprawę, ale rozwiązałem problem nadmiaru metody GetWebResponse i rzuciłem wyjątek sam w razie potrzeby.

Zrobiłem to zmieniając kod klienta usługi sieciowej wygenerowany przez Visual Studio po dodaniu Web Reference (generowana nazwa pliku to: Reference.cs, czasami nie jest widoczna w rozwiązaniu, musisz kliknąć "Pokaż wszystkie pliki" na górze szyby rozwiązań i rozłóż plików referencyjnych usług internetowych.

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

miałem podobny problem kilka lat temu. problem z kodem stanu HTTP 500 jest to, że wywołanie usługi nie połączyć się z serwerem. Dlatego Rozwiązaniem, które zadziałało, było upewnienie się, że parametry mają dokładnie taki sam schemat jak metody sieci zdefiniowane jako. Wszelkie niedopasowania w umowach dotyczących danych może spowodować błąd serwera HTTP 500 HTTP.

Powiązane problemy