Len*_*nny 5 .net c# web-services asmx
有没有办法从.Net客户端捕获.asmx Web服务返回的HTTP 500错误?
使用.Net 4.5(VS2015),.Net客户端代码使用.asmx Web服务并使用以下代码调用它:
var client = new WebserviceApi.MyServiceSoapClient();
var response = client.MyWebServiceMethod();
Run Code Online (Sandbox Code Playgroud)
如果.asmx Web服务返回HTTP 500错误,其中包含错误消息详细信息的SOAP消息,则"response"变量将设置为null.
使用Fiddler,流量显示来自.asmx Web服务的HTTP 500响应.响应包含SOAP XML消息,其中包含有关错误的详细信息.
在.Net客户端代码中没有抛出或捕获异常,执行继续正常进行.
这意味着客户无需了解有关异常性质的信息.所有客户端代码都可以检查"response"是否为null,但是异常消息对客户端代码不可用.
如果.asmx Web服务返回HTTP 500响应,有没有办法强制.Net客户端代码抛出异常,以便可以检查/记录错误消息?
我对轴(java)网络服务有类似的问题。即使响应确实是 HTTP 500,他们也抛出了没有出现在我这边的异常。
我不能肯定地说这会解决你的情况,但我解决了我的覆盖 GetWebResponse 方法并在需要时自己抛出异常的问题。
我是通过在添加 Web 引用后更改 Visual Studio 生成的 Web 服务客户端代码来实现的(生成的文件名是:Reference.cs,有时它在解决方案中不可见,您必须单击解决方案窗格顶部的“显示所有文件”然后展开您的 Web 服务参考文件。
internal class ChangedWebServiceClient : SomeSoapService
{
protected override WebResponse GetWebResponse(WebRequest request)
{
var response = base.GetWebResponse(request);
if (response != null)
{
var responseField = response.GetType().GetField("_base", BindingFlags.Instance | BindingFlags.NonPublic);
if (responseField != null)
{
var webResp = responseField.GetValue(response) as HttpWebResponse;
if (webResp != null)
{
if (webResp.StatusCode.Equals(HttpStatusCode.InternalServerError))
throw new WebException(
"HTTP 500 - Internal Server Error happened here. Or any other message that fits here well :)");
}
}
}
return response;
}
}
Run Code Online (Sandbox Code Playgroud)
经过一番研究后,发现从 ASMX 抛出的所有错误都是 SoapException 类的形式,因此对该类的 try catch 应该足以处理该错误。
nivlam 还提出了一个很好的解决方案,可以在此答案上从 ASMX 和 SOAP 读取原始请求数据,您可能会从那里获得错误代码。
| 归档时间: |
|
| 查看次数: |
2589 次 |
| 最近记录: |