ServiceClientBase的异常处理程序

Ron*_*rby 9 servicestack

我想处理WebServiceException我的服务客户端抛出的所有内容.现在有一个很好的方法吗?

例如,我在Windows窗体应用程序周围传递一个ServiceClientBase.我在http标头中将api密钥传递给服务器.对于api密钥无效的任何请求,我想显示一个消息框,告诉用户该请求是未授权的,他们应该设置API密钥.但我不希望这个代码到处都是:

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

像这样的东西会很好:

_client.WebServiceExceptionHandler += TheHandler;
Run Code Online (Sandbox Code Playgroud)

我知道有可以挂钩的本地响应过滤器,但我需要物化的WebServiceException.

我正在看ServiceClientBase.cs看看我能做些什么,但我很感激任何帮助.谢谢.

Jac*_*hee 2

如果我可以将其视为一个设计问题,而不是一个 API 问题,那么答案就是包装您的服务客户端。就我个人而言,我做了类似的事情,这样我就可以在客户端上记录服务异常。

这可能是一个起点:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

随着时间的推移,您可能会发现这种额外的间接级别的其他好处,例如添加本地缓存、记录所有请求和响应[到调试控制台]。而且,一旦在所有客户端代码中使用它,维护起来就非常便宜。

就 API 而言,我认为它无法提供您想要的东西。就我个人而言,我对它本身很满意(特别是IReturn<T>当整合您想要的功能时,界面会有所帮助)。但是,如果您对此不满意,那么您只需提出一个拉取请求,就可以与Demis就改进它进行对话。(-=