我需要从.NET客户端通过SSL使用AXIS 1.4 Web服务。目前我们实现了System.Net.WebClient,我们手工创建XML请求并将其上传到Web服务。这对于获取有效结果非常有用,但是如果发生异常(java.rmi.RemoteException),我们只会返回“Interal Server Error”的WebException。检查响应不会产生更多细节。
如果我们将Visual Studio 2010中的服务添加为.NET 2.0 Web引用(SoapHttpClientProtocol),我们会收到所需的java.rmi.RemoteException以及纠正问题的所有必要细节。但是,来自有效请求的所有结果响应都为空。
注意:其他(竞争对手的).NET客户端(我们没有源代码)会成功使用此服务。
重申:通过WebClient的有效请求会收到有效的响应对象,但每个异常都是“内部服务器错误”,通过Web Reference的有效请求会收到空响应,但会准确显示所需的java.rmi.RemoteException。
目标:有效响应以及完整的java.rmi.RemoteExceptions(不是模糊的内部服务器错误),即使我可以抛出SoapException,这将是一个巨大的改进。
IDE:Visual Studio 2010 SP1
操作系统:Windows 7
.NET:2.0 / 3.5 / 4.0(我尝试了所有三个版本具有相同的结果)
语言:C#
示例WebClient代码:
var lvResult = "";
try
{
var lvStr = "sample request";
var client = new WebClient();
client.Headers.Add("SOAPAction", "SampleRequest");
lvResult = client.UploadString(cvURL, lvStr);
}
catch (Exception ex)
{
}
更新:更具体地说,如果抛出Soap异常,这不会成为问题,但抛出的唯一异常是“WebException”,它似乎不能让我访问faultstring。以下是我从AXIS服务收到的原始肥皂故障:
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<soapenv:Fault>
<faultcode>soapenv:Server.userException</faultcode>
<faultstring>java.rmi.RemoteException: Error in posting Request: Code 02 - No UserId for this user name/password.</faultstring>
<detail>
<ns1:hostname xmlns:ns1="http://xml.apache.org/axis/">xxxx</ns1:hostname>
</detail>
</soapenv:Fault>
解决方案:我通过捕获WebException并获取异常响应的响应流找到了一种解决方法 -
catch(WebException pvEx)
{
var lvResponseString = "";
if (pvEx.Response != null)
{
using (var lvStreamReader = new StreamReader(pvEx.Response.GetResponseStream()))
{
//This string now contains the xml soap response
lvResponseString = lvStreamReader.ReadToEnd();
}
}
}
答案 0 :(得分:1)
这是一篇关于您遇到的问题的帖子:http://bytes.com/topic/net/answers/427757-soap-faults。
我认为您的AXIS服务正在返回SOAPFAULT。您只需要知道如何在.NET客户端中处理它。这篇文章对此进行了描述。
祝你好运, Marco Kroonwijk