2013-04-18 34 views
9

Tôi muốn xử lý tất cả các yêu cầu của WebServiceException do khách hàng dịch vụ của tôi gửi. Có cách nào tốt để làm điều này ngay bây giờ không?Xử lý ngoại lệ cho ServiceClientBase

Ví dụ: tôi đang chuyển một ServiceClientBase duy nhất xung quanh cửa sổ ứng dụng biểu mẫu. Tôi đang chuyển một khóa api đến máy chủ trong tiêu đề http. Đối với bất kỳ yêu cầu nào mà khóa api không hợp lệ, tôi muốn hiển thị một hộp thông báo cho người dùng biết rằng yêu cầu đó là trái phép và họ nên đặt khóa API. Nhưng tôi không muốn mã này ở khắp mọi nơi:

try 
{ 
    _client.Get(new ReqDto()); 
} 
catch (WebServiceException ex) 
{ 
    if(ex.StatusCode == 401) 
     Util.ShowUnauthorizedMessageBox(); 
} 

Something như thế này sẽ được tốt đẹp:

_client.WebServiceExceptionHandler += TheHandler; 

Tôi biết có bộ lọc phản ứng địa phương mà tôi có thể móc vào, nhưng tôi cần WebServiceException thể hóa .

Tôi đang xem ServiceClientBase.cs để xem tôi có thể làm gì nhưng tôi đánh giá cao bất kỳ trợ giúp nào. Cảm ơn.

Trả lời

2

Nếu tôi có thể tiếp cận vấn đề này dưới dạng câu hỏi thiết kế, chứ không phải là câu hỏi API, thì câu trả lời là để gói ứng dụng khách của bạn. Cá nhân, tôi đã làm một cái gì đó tương tự vì vậy tôi có thể đăng nhập ngoại lệ dịch vụ trên máy khách.

Đây có thể là điểm khởi đầu:

public class MyServiceClient : IDisposable 
{ 
    public ServiceClientBase ServiceClient { get; set; } 

    string _serviceUri; 
    public string ServiceUri 
    { 
     get { return _serviceUri; } 
     set { _serviceUri = value; ServiceUriChanged(); } 
    } 

    public MyServiceClient() 
    { 
     ServiceUri = "http://127.0.0.1:8080"; 
    } 

    public void Dispose() 
    { 
     ServiceClient.Dispose(); 
    } 

    public TResponse Get<TResponse>(IReturn<TResponse> request) 
    { 
     try 
     { 
      return ServiceClient.Get(request); 
     } 
     catch (WebServiceException ex) 
     { 
      if(ex.StatusCode == 401) 
       Util.ShowUnauthorizedMessageBox(); 
     } 
    } 

    void ServiceUriChanged() 
    { 
     if (ServiceClient != null) 
      ServiceClient.Dispose(); 
     ServiceClient = new JsonServiceClient(ServiceUri); 
    } 
} 

Theo thời gian bạn có thể thấy lợi ích khác cho mức bổ sung này gián tiếp, chẳng hạn như thêm bộ nhớ đệm địa phương, đăng nhập tất cả các yêu cầu & phản ứng [một debug console]. Và, một khi nó được sử dụng trong tất cả các mã khách hàng của bạn, nó là khá rẻ để duy trì.

Theo như API đi, tôi không nghĩ rằng nó cung cấp những gì bạn muốn. Cá nhân, tôi đã hài lòng với nó vì nó là (đặc biệt là giao diện IReturn<T> giúp khi hợp nhất các chức năng như một trong những bạn muốn). Nhưng, nếu bạn không hài lòng với nó, sau đó bạn là một yêu cầu kéo ra khỏi một hộp thoại với Demis về việc cải thiện nó. (- =

1

Đây là một chút muộn cho trò chơi, nhưng tôi đã chạy vào cùng một thứ để bắt đầu đào sâu vào nguồn. Có thực sự là một sửa chữa đơn giản cho điều này, ghi đè lên phương pháp HandleResponseException trong bất kỳ ServiceClient bạn đang có sử dụng trực tiếp từ bình luận:.

 /// <summary> 
     /// Called by Send method if an exception occurs, for instance a System.Net.WebException because the server 
     /// returned an HTTP error code. Override if you want to handle specific exceptions or always want to parse the 
     /// response to a custom ErrorResponse DTO type instead of ServiceStack's ErrorResponse class. In case ex is a 
     /// <c>System.Net.WebException</c>, do not use 
     /// <c>createWebRequest</c>/<c>getResponse</c>/<c>HandleResponse&lt;TResponse&gt;</c> to parse the response 
     /// because that will result in the same exception again. Use 
     /// <c>ThrowWebServiceException&lt;YourErrorResponseType&gt;</c> to parse the response and to throw a 
     /// <c>WebServiceException</c> containing the parsed DTO. Then override Send to handle that exception. 
     /// </summary> 

cá nhân tôi đang làm một cái gì đó như sau trên override của tôi về JsonServiceClient

protected override bool HandleResponseException<TResponse>(Exception ex, object request, string requestUri, Func<System.Net.WebRequest> createWebRequest, Func<System.Net.WebRequest, System.Net.WebResponse> getResponse, out TResponse response) 
    { 
     Boolean handled; 
     response = default(TResponse); 
     try 
     { 
      handled = base.HandleResponseException(ex, request, requestUri, createWebRequest, getResponse, out response); 
     } 
     catch (WebServiceException webServiceException) 
     { 
      if(webServiceException.StatusCode > 0) 
       throw new HttpException(webServiceException.StatusCode, webServiceException.ErrorMessage); 
      throw; 
     } 
     return handled; 
    }