gpt4 book ai didi

servicestack - ServiceClientBase 的异常处理程序

转载 作者:行者123 更新时间:2023-12-04 04:31:00 25 4
gpt4 key购买 nike

我要处理所有WebServiceException由我的服务客户抛出。现在有没有好的方法可以做到这一点?

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

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

像这样的东西会很好:
_client.WebServiceExceptionHandler += TheHandler;

我知道我可以连接到本地响应过滤器,但我需要物化 WebServiceException。

我正在查看 ServiceClientBase.cs 以了解我能做什么,但我会很感激任何帮助。谢谢。

最佳答案

如果我可以将此作为设计问题而不是 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);
}
}

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

就 API 而言,我认为它不能提供您想要的东西。就我个人而言,我一直很满意它的原样(尤其是 IReturn<T> 界面有助于整合您想要的功能)。但是,如果您对它不满意,那么您距离 Demis 的对话框只有一个拉取请求。关于改进它。 (-=

关于servicestack - ServiceClientBase 的异常处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16093211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com