2009-08-18 37 views
9

Tôi có dịch vụ web mà tôi đã tạo ngoại lệ tùy chỉnh. Giả sử tên của ngoại lệ này là InvalidContractException.Bắt ngoại lệ tùy chỉnh từ Dịch vụ web ASMX

Điều tôi muốn làm là nếu một bước cụ thể xảy ra, tôi muốn ném ngoại lệ này. Tuy nhiên, tôi không thể tìm ra cách khách hàng sẽ nắm bắt các InvalidContractException để xử lý nó đúng cách.

Đây là một dịch vụ Web ASP.Net viết bằng C#

Trả lời

17

Bạn không thể làm điều này: Dịch vụ

  1. Web làm những lỗi SOAP. Ngoại lệ là nền tảng cụ thể.
  2. Khi ngoại lệ được giải thể trong dịch vụ web ASMX, .NET sẽ dịch nó thành lỗi SOAP. Các chi tiết của ngoại lệ không được đăng.
  3. Trong máy khách ASMX, lỗi SOAP sẽ được dịch sang SoapException.

Dịch vụ web ASMX không có hỗ trợ thích hợp cho lỗi SOAP. Không có cách nào để có được bất kỳ ngoại lệ nào khác ngoài SoapException ở phía máy khách.

Tuy nhiên, một lý do khác để nâng cấp lên WCF.


Như một ví dụ về những gì bạn không có thể làm với ASMX, dưới đây là cách WCF hoạt động. WCF cho phép bạn chỉ định, đối với mỗi hoạt động dịch vụ web, mà lỗi nó có thể trở lại: sau đó

[ServiceContract] 
public interface IMyServiceContract 
{ 
    [FaultContract(typeof(IntegerZeroFault))] 
    [FaultContract(typeof(SomeOtherFault))] 
    [OperationContract] 
    public string GetSomeString(int someInteger); 
} 

[DataContract] 
public class IntegerZeroFault 
{ 
    [DataMember] 
    public string WhichInteger {get;set;} 
} 

[DataContract] 
public class SomeOtherFault 
{ 
    [DataMember] 
    public string ErrorMessage {get;set;} 
} 

public class MyService : IMyServiceContract 
{ 
    public string GetSomeString(int someInteger) 
    { 
     if (someInteger == 0) 
      throw new FaultException<IntegerZeroFault>(
       new IntegerZeroFault{WhichInteger="someInteger"}); 
     if (someInteger != 42) 
      throw new FaultException<SomeOtherFault>(
       new SomeOtherFault{ErrorMessage ="That's not the anaswer"}); 
     return "Don't panic"; 
    } 
} 

Một WCF khách hàng có thể bắt FaultException<SomeOtherFault>, ví dụ. Khi tôi đã thử điều này với một khách hàng Java, nó đã có thể bắt SomeOtherFault, mà IBM Rational Web Developer được tạo ra để lấy được từ lớp Java Exception.

0

Trong cuộc gọi khách hàng của bạn với dịch vụ WCF mà ném lỗi, bạn làm

thử ..

lỗi bắt như FaultException (của YourService.FooBarFault)

cuối thử

Bạn phải khai báo một FaultContract cho phương pháp dịch vụ mà có thể tạo ra thứ lỗi điện tử, ví dụ:

_

<FaultContract(GetType(FooBarFault))> _ 

Function yourCall 
+0

Anh ấy đang sử dụng ASMX. Ông gọi nó là "Dịch vụ Web ASP.NET" –

+0

Ah ok .. tôi nghĩ rằng ông đã sử dụng WCF –

5

Nếu mục tiêu của bạn là ném ngoại lệ để người dùng có thể biết rằng đã xảy ra sự cố, một số ngoại lệ cụ thể đã xảy ra và xử lý đặc biệt, bạn có tùy chọn. Bạn chỉ cần dựa vào việc thực hiện đúng proxy máy khách (Thực tế, một tùy chọn là tự cung cấp proxy cho khách hàng).

Có một bài viết hữu ích sẵn có here về cách hoạt động của SoapException.

Về cơ bản, nó đi xuống để mã hóa chi tiết ngoại lệ của bạn (ví dụ như mã lỗi) trong nút chi tiết của SoapException và sau đó phân tích cú pháp nó ở phía máy khách trước khi thực hiện lại ngoại lệ.

Không có cách nào để tạo lại ngoại lệ như thể nó được ném qua ranh giới dịch vụ và không có cách tự động để nhận bất kỳ thứ gì ngoại trừ SoapException ở phía máy khách.

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