有没有办法从 .Net 客户端捕获 .asmx Web 服务返回的 HTTP 500 错误?
使用 .Net 4.5 (VS2015),.Net 客户端代码使用 .asmx Web 服务并使用以下代码调用它:
var client = new WebserviceApi.MyServiceSoapClient();
var response = client.MyWebServiceMethod();
如果 .asmx Web 服务返回 HTTP 500 错误以及包含错误消息详细信息的 SOAP 消息,“response”变量将设置为 null。
使用 Fiddler,流量显示来自 .asmx 网络服务的 HTTP 500 响应。响应包含带有错误详细信息的 SOAP XML 消息。
.Net 客户端代码中没有抛出或捕获异常,继续正常执行。
这意味着客户端无法获取有关异常性质的信息。客户端代码所能做的就是检查“response”是否为空,但异常消息对客户端代码不可用。
如果 .asmx Web 服务返回 HTTP 500 响应,是否有任何方法可以强制 .Net 客户端代码抛出异常,以便检查/记录错误消息?
最佳答案
我对 axis (java) 网络服务有类似的问题。他们抛出了我这边没有出现的异常,即使响应实际上是 HTTP 500。
我不能肯定地说这会解决您的问题,但我通过覆盖 GetWebResponse 方法并在需要时自行抛出异常解决了我的问题。
我是通过更改添加Web Reference后Visual Studio生成的web服务客户端代码来实现的(生成的文件名为:Reference.cs,有时在解决方案中看不到,必须点击顶部的'Show All files'解决方案 Pane ,然后展开您的 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;
}
}
关于c# - .Net 代码捕获来自 .asmx 网络服务的 HTTP 500 错误响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33389489/