webservice调用返回值为null问题

dailng 2016-09-02 12:54:27
大致情况为对方只给了一个wsdl文件(直接在浏览器中访问wsdl文件中的url地址无法访问),我用vs的添加服务引用生成了调用该接口的代理类,其中有些方法能正常调用并获取到返回值,但是有两个方法调用不报错就返回值一直是null,询问对方的结果是他们那边并没有看到这两个方法的请求记录。然后我用第三方工具soapUI测试调用又能正常获取到返回值。两种方式调用的参数基本可以保证一直(vs调试获取的参数复制到soapUI里面调用的)。有没有人碰到过这种情况?或者有什么办法在VS里面能检测到是否发送了请求?
这个服务提供者是:移动信息平台-企讯通(发短信用的),或者有没有哪位用C#对接过这个短信平台?

在这个位置调试获取到的返回值一直为null。
...全文
8846 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
hongrizaitian 2017-04-01
  • 打赏
  • 举报
回复
我通过URLConnection调用webservice,参数传过去了,没有返回值。估计是同类问题吧
			URL url = new URL("http://www.webxml.com.cn/WebServices/WeatherWS.asmx" );
String soap_xml = soap_xml(city,"");
System.out.println(soap_xml);

HttpURLConnection httpURLConnection=(java.net.HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
//使用http进行输出
httpURLConnection.setDoOutput(true);
//使用http进行输入
httpURLConnection.setDoInput(true);
//通过输出流发送数据
OutputStream outputStream = httpURLConnection.getOutputStream();
outputStream.write(soap_xml.getBytes());
outputStream.close();

//接收服务端响应数据
InputStream inputStream = httpURLConnection.getInputStream();

//使用buffer读取存在的数据
byte[] buffer = new byte[1024];

//使用字节输出流存储读取的数据
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
while(true){
int len = inputStream.read(buffer);
//如果流水读取完则退出循环
if(len == -1){
break;
}
byteArrayOutputStream.write(buffer,0,len);
}

//得到响应数据
String response_string = byteArrayOutputStream.toString();

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<getWeather xmlns="http://WebXml.com.cn/">
<theCityCode>北京</theCityCode>
<theUserID></theUserID>
</getWeather>
</soap:Body>
</soap:Envelope>

响应回来的是
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<getWeatherResponse xmlns="http://WebXml.com.cn/">
<getWeatherResult>
<string>查询结果为空。http://www.webxml.com.cn/</string>
</getWeatherResult>
</getWeatherResponse>
</soap:Body>
</soap:Envelope>
dailng 2016-09-26
  • 打赏
  • 举报
回复
问题已经解决,就结帖了吧!
ps:为什么我发的贴过了这么久都还是只有一个人来帮助
dailng 2016-09-26
  • 打赏
  • 举报
回复
引用 5 楼 dongxinxi 的回复:
其实问题在于Java和C#的数组序列化之后的差异造成的。添加服务引用的时候,按道理应该会帮你生成 ArrayOfXXX这样的数组包装类的,这样就不会出错了。 其实你可以在你贴出的getSendResp方法上加声明来修正(但是一般不需要) [return: System.Xml.Serialization.XmlArrayItemAttribute(item")]
这种方式应该不行吧,这种方式应该只是告诉程序要将哪个节点的内容反序列化成对象吧。因为项目已经正式开始运行不好在服务器上进行修改测试,但是本地使用C#程序对无ArrayOfXXX这样节点的xml反序列化成数组是不行的,而对方服务返回的xml中是没有arrayofxxx这样的节点的。
dailng 2016-09-23
  • 打赏
  • 举报
回复
问题已经解决了,百度了下出现这种情况有可能是参数问题: 在调用时传递参数类型问题,因为对方是java语言开发的服务,我这边是C#开发的客户端,参数类型像int、datetime这些在调用的时候可能获取不到值,然后调用失败返回结果就可能为null(ps:对方跟我说他那边没看到我的调用记录,我最开始以为是这原因,在那调了很久,最终看到他定义的参数全是string类型应该不会出现这种情况,才想到是不是返回值有问题) 我这种情况最终发现是返回值对象数组与xml之间序列化与反序列化出了问题,我用HttpWebRequest方式请求了下服务发现返的xml中有值,然后用XmlSerializer尝试反序列化成对象数组(对方服务定义的返回值为一个自定义对象的数组),发现结果是null。 返回值类型为:SendRespMsg[] 返回的xml为: <SOAP-ENV:Envelope > <SOAP-ENV:Header/> <SOAP-ENV:Body> <impl:getSendRespResponse> <getSendRespReturn> <item> <msgid>0</msgid> <result>22</result> <sequenceid>0</sequenceid> <type>0</type> </item> <item> <msgid>2</msgid> <result>33</result> <sequenceid>2</sequenceid> <type>2</type> </item> </getSendRespReturn> </impl:getSendRespResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope> 然后我用C#写的代码定义了一个SendRespMsg[],然后用XmlSerializer序列化的结果是: <?xml version="1.0"?> <ArrayOfSendRespMsg xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <SendRespMsg> <msgid>1</msgid> <result>1</result> <sequenceid>1</sequenceid> <type>1</type> </SendRespMsg> <SendRespMsg> <msgid>2</msgid> <result>2</result> <sequenceid>2</sequenceid> <type>2</type> </SendRespMsg> </ArrayOfSendRespMsg> 对比发现的话就可以看出他返回的是getSendRespReturn节点中间包含N多个item以表达为数组,而C#中就是以N多个SendRespMsg节点表达为数组。 (当然以上内容是根据我自己碰到的情况作出猜测分析,有什么不对的地方请指出) 结果就是这两个出问题的方法只能自己用HttpWebRequest方式请求并处理结果了。
dailng 2016-09-23
  • 打赏
  • 举报
回复
引用 2 楼 dongxinxi 的回复:
你用soupUI测试也是用的那个wsdl文件生成的测试用用例吗? 可以用fiddler抓包对比两个请求(Header和Body)
感谢帮助,soapUI测试也是用哪个wsdl文件生成的,然而对方绑定了调用ip地址,没办法在本地模拟情况,服务器上公司不让装抓包工具。
  • 打赏
  • 举报
回复
其实问题在于Java和C#的数组序列化之后的差异造成的。添加服务引用的时候,按道理应该会帮你生成 ArrayOfXXX这样的数组包装类的,这样就不会出错了。 其实你可以在你贴出的getSendResp方法上加声明来修正(但是一般不需要) [return: System.Xml.Serialization.XmlArrayItemAttribute(item")]
  • 打赏
  • 举报
回复
你用soupUI测试也是用的那个wsdl文件生成的测试用用例吗? 可以用fiddler抓包对比两个请求(Header和Body)
dailng 2016-09-12
  • 打赏
  • 举报
回复
自己顶,难道就没人碰到过类似的问题嘛

12,162

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 Web Services
社区管理员
  • Web Services社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧