2013-04-18 12 views
9

Chcę obsłużyć wszystkie zgłaszane przez mojego klienta usługi WebServiceException. Czy jest to dobry sposób, aby to teraz zrobić?Handler wyjątków dla ServiceClientBase

Na przykład przechodzę przez jedną ServiceClientBase wokół aplikacji formularzy systemu Windows. Przekazuję klucz api do serwera w nagłówku http. W przypadku każdego żądania, że ​​klucz API jest nieprawidłowy, chcę wyświetlić okno komunikatu informujące użytkownika, że ​​żądanie było nieautoryzowane i powinien ustawić klucz API. Ale nie chcę tego kodu wszędzie:

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

Coś takiego byłoby miło:

_client.WebServiceExceptionHandler += TheHandler; 

Wiem, że lokalny filtr odpowiedź, że mogę zahaczyć się, ale muszę zmaterializował WebServiceException .

Szukam ServiceClientBase.cs, aby zobaczyć, co mogę zrobić, ale będę wdzięczny za pomoc. Dzięki.

Odpowiedz

2

Jeśli mogę podejść do tego jako pytanie projektowe, a nie jako pytanie API, odpowiedzią jest zawinięcie klienta usługi. Osobiście zrobiłem coś podobnego, dzięki czemu mogę rejestrować wyjątki usługi na kliencie.

To może być punkt wyjścia:

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); 
    } 
} 

biegiem czasu można znaleźć inne korzyści to dodatkowy poziom pośredni, takie jak dodawanie buforowania lokalnego, rejestrowanie wszystkich żądań & Odpowiedzi [do konsoli debugowania]. A jeśli jest już używany we wszystkich kodach klienta, jest dość tani w utrzymaniu.

Jeśli chodzi o API, nie sądzę, że oferuje to, co chcesz. Osobiście jestem z niego zadowolony (zwłaszcza, że ​​interfejs IReturn<T> pomaga w konsolidacji funkcji takich jak ta, którą chcesz). Ale jeśli nie jesteś z tego zadowolony, jesteś jednym z żądań odciągnięcia z okna dialogowego z poprawką Demis. (-. =

1

To jest trochę późno do gry, ale został uruchomiony na tej samej rzeczy tak zaczął kopać w źródle Jest rzeczywiście prosty fix do tego przesłonić metodę w cokolwiek ServiceClient jesteś HandleResponseException korzystając bezpośrednio z uwagami.

 /// <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> 

osobiście robię coś jak następuje na moim ręcznym na 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; 
    }