最近在做一个动态库,要求调用两个webservice地址完成。
首先我就用soapUI工具将两个地址都测了一遍,确定能走通后开始写代码。
代码里采用的HttpPost方式,
第一个接口进行的比较顺利直接就完成了,但第二个接口就开始出问题。同样的方式在soapUI同样成功的报文,但放到代码里面就一直返回“远程服务器返回错误:(500)内部服务器错误”
期间更改各种配置,都于事无补。
迫于无奈,只能尝试直接引用服务地址的方式,放弃httppost,奇迹般好了。
可是在生成dll的时候,由于调用方式是引用服务,需要依赖服务配置文件。根本无法提供给第三方平台灵活使用,就这样我又被打回了原型。
在大神建议下使用了Fiddler网络抓包工具,将每次请求都挨个拿出来一一对应了一遍才发现,不论是soapUI工具还是服务引用的方式,Request的请求头里面都有SOAPAction的属性。走的是soap协议。而C#HttpPost调用的报文头HttpWebRequest类,没有SOAPAction的属性。
在查阅资料后发现HttpWebRequest有一个Headers.Add的方法可以手动添加这一属性
最后
request.Headers.Add("SOAPAction", "http://******.org/*******/******");
成功调用,解决了问题。