话说是这样的,这两天开发一个短信发送功能,客户给了一个 Web Service 地址(没有文档),让我调用就可以发送了,
我在VS 2013添加了服务引用,一切正常,可是执行代理方法时,怎么都报错
RPC Message receiveExtMTPushRequest1 inOperation receiveExtMTPush1 has an invalid body name receiveExtMTPush. It must be receiveExtMTPush1难道我的方法名错了吗?可是VS自动生成的不可能错,参数也不可能错(客户核对过)。
我用浏览器打开这个 web service,描述是一个 AXIS web service,难道 .NET 调用 AXIS web service 就不行?看了下 WSDL 也是标准的啊。
于是我尝试网上说的动态调用方式,折腾来去反射时就报错,算了看看其它方法吧。
我想找一个 web service 调试工具吧,如果再不成功就告诉客户 web service 是不是有问题?我就找到了 .NET WebService Studio,很轻量的一个工具,几十K。
[flash=500,400]http://s1.knowsky.com/20160211/5pw1yacqdry47.png[/flash]
填好EndPoint -> 点击GET获取到方法和参数列表 -> 选中Input中每个参数输入相应的值 -> 点击Invoke执行,我靠,Output中居然成功了。
点击 Request/Response看看请求和响应的数据
[flash=500,400]http://s1.knowsky.com/20160211/yxwheqkj35w48.png[/flash]
这下好办了,把 Request 中的 SOAP 放到 Fiddler 中去POST一下,成功!
[flash=500,400]http://s1.knowsky.com/20160211/qnq04dbfgl448.png[/flash]
VS生成的代理类调用不成功,应该是少了一个HTTP HEADER参数 SOAPAction(不是SOAP HEADER),这个参数有一定意义,在WSDL中也可以找到,在跨平台调用时尤为常见,大家可以网上搜搜。
解决方案:
1. 自己组合一个SOAPxml,然后用 HttpClient或WebRequest 来调用 Web Service,然后解析返回的XML即可;
2. 在 .NET WebService Studio 中点击 WSDLs &PRoxy,里面有代理类和客户端代码,复制到项目中使用。
[flash=500,400]http://s1.knowsky.com/20160211/j033w3knx5u48.png[/flash]