2015-10-28 18 views
5

Có cách nào để bắt lỗi HTTP 500 được trả về bởi dịch vụ web .asmx từ máy khách Net không?.Mã mã để nhận phản hồi lỗi HTTP 500 từ dịch vụ web .asmx

Sử dụng Net 4.5 (VS2015), mã khách hàng Net tiêu thụ các dịch vụ .asmx web và gọi nó bằng cách sử dụng mã bên dưới:

var client = new WebserviceApi.MyServiceSoapClient(); 

var response = client.MyWebServiceMethod(); 

Nếu dịch vụ web asmx trả về một HTTP 500 lỗi với một thông điệp SOAP chứa thông tin chi tiết lỗi, biến "response" được đặt thành null.

Sử dụng Fiddler, lưu lượng truy cập hiển thị phản hồi HTTP 500 từ dịch vụ web .asmx. Phản hồi chứa một thông báo XML SOAP với các chi tiết về lỗi.

Không có ngoại lệ nào được ném hoặc bị bắt trong mã máy khách .Net, quá trình thực hiện vẫn tiếp tục như bình thường.

Điều này có nghĩa là không có thông tin nào để khách hàng nhận về bản chất của ngoại lệ. Tất cả các mã khách hàng có thể làm là kiểm tra xem "phản hồi" là null, nhưng thông báo ngoại lệ không có sẵn cho mã máy khách.

Có cách nào để buộc mã máy khách .Net ném ngoại lệ nếu dịch vụ web .asmx trả về phản hồi HTTP 500 để thông báo lỗi có thể được kiểm tra/ghi nhật ký không?

+0

Bạn không thể bắt ngoại lệ bằng cách sử dụng câu lệnh 'try cath'? – anmarti

+0

Không có ngoại lệ được ném, thực thi tiếp tục như bình thường với một biến "phản ứng" null. – Lenny

+0

Vì vậy, làm thế nào để bạn biết bạn nhận được 500? – anmarti

Trả lời

2

Sau khi nghiên cứu này một chút, có vẻ như tất cả các lỗi được ném từ ASMX đều ở dạng lớp SoapException, vì vậy hãy thử bắt với lớp đó là đủ để xử lý lỗi đó.

Further reading on ASMX exception handling

SoapException Class

nivlam cũng propsed một giải pháp tốt để đọc dữ liệu theo yêu cầu thô từ ASMX và SOAP trên trên this answer và có thể bạn có thể nhận được mã lỗi từ đó.

+0

không may trong trường hợp này một ngoại lệ không được ném, sẽ là tốt đẹp mặc dù. – Lenny

+0

@Lenny thử tôi thêm một phần thứ hai ở phía dưới, nó có một liên kết đến một câu trả lời của nivlam, sử dụng phương pháp của mình để đọc đầu ra thô, và xác định lỗi bạn đang nhận được –

4

Tôi gặp sự cố tương tự đối với dịch vụ web trục (java). Họ đã ném ngoại lệ không xuất hiện ở bên cạnh tôi mặc dù phản hồi thực sự là HTTP 500.

Tôi không thể chắc chắn điều này sẽ giải quyết trường hợp của bạn, nhưng tôi đã giải quyết được phương pháp GetWebResponse và ném ngoại trừ một mình khi cần.

Tôi đã làm điều đó bằng cách thay đổi mã máy khách dịch vụ web do Visual Studio tạo sau khi thêm tham chiếu web (tên tệp được tạo là: Reference.cs, đôi khi nó không hiển thị trong giải pháp, bạn phải nhấp vào 'Hiển thị tất cả tệp' ở trên cùng của ngăn giải pháp và sau đó mở ra các tệp tham chiếu dịch vụ web của bạn

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

Tôi đã gặp sự cố tương tự cách đây vài năm. Vấn đề với mã trạng thái HTTP 500 là cuộc gọi dịch vụ không đến được máy chủ. Bạn không thể gỡ lỗi nó. Giải pháp làm việc cho tôi là đảm bảo rằng các tham số có cùng lược đồ chính xác như của các phương thức web được định nghĩa. Bất kỳ sự không khớp nào trong hợp đồng dữ liệu có thể gây ra lỗi HTTP 500 Internal Server.

Các vấn đề liên quan