2008-08-28 24 views
15

Tôi có một hoạt động dịch vụ web đơn giản như thế này:Làm thế nào để trích xuất ngoại lệ bên trong từ một ngoại lệ xà phòng trong ASP.NET?

[WebMethod] 
    public string HelloWorld() 
    { 
     throw new Exception("HelloWorldException"); 
     return "Hello World"; 
    } 

Và sau đó tôi có một ứng dụng client mà tiêu thụ các dịch vụ web và sau đó gọi các hoạt động. Rõ ràng là nó sẽ ném một ngoại lệ :-)

try 
    { 
     hwservicens.Service1 service1 = new hwservicens.Service1(); 
     service1.HelloWorld(); 
    } 
    catch(Exception e) 
    { 
     Console.WriteLine(e.ToString()); 
    } 

Trong khối catch, những gì tôi muốn làm là trích xuất thông điệp ngoại lệ thực sự để sử dụng nó trong mã của tôi. Trường hợp ngoại lệ bị bắt là một SoapException, đó là tốt, nhưng nó Message tài sản là như thế này ...

System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.Exception: HelloWorldException 
    at WebService1.Service1.HelloWorld() in C:\svnroot\Vordur\WebService1\Service1.asmx.cs:line 27 
    --- End of inner exception stack trace --- 

... và InnerExceptionnull.

Điều tôi muốn làm là trích xuất thuộc tính Message của InnerException (văn bản HelloWorldException trong mẫu của tôi), bất kỳ ai có thể trợ giúp điều đó không? Nếu bạn có thể tránh nó, vui lòng không đề xuất phân tích thuộc tính Message của số SoapException.

Trả lời

6

Rất tiếc, tôi không nghĩ điều này là có thể.

Trường hợp ngoại lệ bạn đang tăng trong mã dịch vụ web của mình đang được mã hóa thành Lỗi xà phòng, sau đó được chuyển thành chuỗi trở lại mã khách hàng của bạn.

Những gì bạn thấy trong thông báo SoapException đơn giản là văn bản từ lỗi Soap, mà không được chuyển đổi thành một ngoại lệ, nhưng chỉ được lưu trữ dưới dạng văn bản.

Nếu bạn muốn trả lại thông tin hữu ích trong điều kiện lỗi thì tôi khuyên bạn nên trả lại lớp tùy chỉnh từ dịch vụ web của bạn có thể có thuộc tính "Lỗi" chứa thông tin của bạn.

[WebMethod] 
public ResponseClass HelloWorld() 
{ 
    ResponseClass c = new ResponseClass(); 
    try 
    { 
    throw new Exception("Exception Text"); 
    // The following would be returned on a success 
    c.WasError = false; 
    c.ReturnValue = "Hello World"; 
    } 
    catch(Exception e) 
    { 
    c.WasError = true; 
    c.ErrorMessage = e.Message; 
    return c; 
    } 
} 
+1

Tại sao tạo lớp tùy chỉnh nếu bạn có thể đạt được nó mà không có? Vui lòng xem lại câu trả lời của tôi trên bài đăng này. – BornToCode

1

Tôi đã gặp phải điều gì đó tương tự cách đây một chút và blogged about it. Tôi không chắc chắn nếu nó được áp dụng chính xác, nhưng có thể được. Mã này đủ đơn giản một khi bạn nhận ra rằng bạn phải đi qua một đối tượng MessageFault. Trong trường hợp của tôi, tôi biết rằng chi tiết chứa một GUID tôi có thể sử dụng để truy vấn lại dịch vụ SOAP để biết chi tiết. Mã trông giống như sau:

catch (FaultException soapEx) 
{ 
    MessageFault mf = soapEx.CreateMessageFault(); 
    if (mf.HasDetail) 
    { 
     XmlDictionaryReader reader = mf.GetReaderAtDetailContents(); 
     Guid g = reader.ReadContentAsGuid(); 
    } 
} 
4

IS có thể!

Dịch vụ ví dụ hoạt động:

try 
{ 
    // do something good for humanity 
} 
catch (Exception e) 
{ 
    throw new SoapException(e.InnerException.Message, 
          SoapException.ServerFaultCode); 
} 

Khách hàng tiêu thụ các dịch vụ:

try 
{ 
    // save humanity 
} 
catch (Exception e) 
{ 
    Console.WriteLine(e.Message);  
} 

Chỉ cần một điều - bạn cần phải thiết lập chế độ customErrors = 'RemoteOnly' hoặc 'Bật' trong web của bạn. config (của dự án dịch vụ).

tín dụng về khám phá tùy chỉnh - http://forums.asp.net/t/236665.aspx/1

+0

Tôi nghĩ rằng bạn có nghĩa là 'ném SoapException mới (e.Message, ...' chứ không phải là thông điệp của InnerException ngoại lệ bị bắt. – Timothy

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