跪求高手解答!用WCF框架,出现“无法理解 SOAP 头 Action”错误

mitisky 2012-07-23 02:26:33
是一个放在服务器端的WCF服务,是.net4.0框架。客户端是在.net2.0框架下的web网站。猜测问题很有可能是框架的不同引起的,但框架改不了,跪求高手解答,急急急急!
下面是错误消息,
无法理解 SOAP 头 Action。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.Web.Services.Protocols.SoapHeaderException: 无法理解 SOAP 头 Action。

源错误:


行 54: [return: System.Xml.Serialization.XmlArrayItemAttribute(Namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays")]
行 55: public string[] GetClients() {
行 56: object[] results = this.Invoke("GetClients", new object[0]);
行 57: return ((string[])(results[0]));
行 58: }


源文件: c:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\website3\f1e516e7\bf5ea1a3\App_WebReferences.3ph-z79m.0.cs 行: 56

堆栈跟踪:


[SoapHeaderException: 无法理解 SOAP 头 Action。]
System.Web.Services.Protocols.SoapHeaderHandling.SetHeaderMembers(SoapHeaderCollection headers, Object target, SoapHeaderMapping[] mappings, SoapHeaderDirection direction, Boolean client) +444826
System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall) +1716
System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters) +204
WebReference.Service1.GetClients() in c:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\website3\f1e516e7\bf5ea1a3\App_WebReferences.3ph-z79m.0.cs:56
_Default.Page_Load(Object sender, EventArgs e) in e:\编程语言\WebSite3\Default.aspx.cs:13
System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +14
System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +35
System.Web.UI.Control.OnLoad(EventArgs e) +99
System.Web.UI.Control.LoadRecursive() +50
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +627


...全文
677 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
风一样的大叔 2014-03-25
  • 打赏
  • 举报
回复
让我们先看看SOAP 1.1规范是怎么定义HTTP SOAPAction header的: SOAPAction HTTP request header被用来标识SOAP HTTP请求的目的地,其值是个URI地址。SOAP发送并不限制格式、URI特征或其必须可解析,那么在这种情况下,发送一个HTTP SOAP请求时,其HTTP客户端必须使用/指明SOAPAction HTTP request header。 SOAPAction header的内容可以被用在服务端,诸如:防火墙适当的过滤基于HTTP的SOAP请求消息等场景。SOAPAction header的值为空串("")表示SOAP消息的目的地由HTTP请求的URI标识;无值则表示没有指定这条消息的目的地。 看了官方的定义,相信大家也迷糊了,迷糊在“目的地”这个词上吧?那么,给它一个准确的说法吧——“确定执行某一行为的路径”。 看一个SOAP消息的例子: <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <m:GetLastTradePrice xmlns:m="Some-URI"> <symbol>XYS</symbol> </m:GetLastTradePrice> </SOAP-ENV:Body> </SOAP-ENV:Envelope> 很明显的,这条消息指明了要去执行服务端的“GetLastTradePrice”这个方法,开发者不会对此没有疑问,这样看来,SOAP Action也许显得多余了? 然而,在另一种SOAP消息的发送场景中,却少不了SOAP Action。在这种场景中,SOAP消息并没有显示的指定要调用的服务方法名,而是利用底层的传输协议发送(这样的话,一般会被Web services忽视),例如使用HTTP的Post方式发送的SOAP消息。 拿AWT组件容器来举个例子吧,我们知道有很多AWT容器,例如:Panel,Box,Window等等,很多情况下,开发者知道他们创建的泛型容器对象下真正是什么对象。那么,假设下面两段代码里的java.awt.Container对象其实是一个Box吧: 1. comp = new TextField( "test" ); java.awt.Container c = Foo.bar(); c.add( comp ); 2. comp = new TextField( "test" ); java.awt.Container c = Foo.bar(); ((java.awt.Panel)c).add( comp ); 以上两段代码产生两种不同的结果。“add()”方法对两者似乎有着相同的意义,但是在代码2中其被扩展为“作为一个Panel对象去add”。所以很明显的,代码2会抛出一个异常,因为我们知道这个对象实际上是Box,而我们的代码期待的是Panel。 HTTP POST的意义正如这个例子中的“add()”方法一样,HTTP POST提供一个关于SOAPAction如何被使用的索引;而SOAPAction header的值则应该被用来指明这个“扩展”的目的地——这条SOAP/HTTP消息发送者所期待的处理容器的名称(可以这样理解:即相应的API方法)。那么,正如上面那个AWT例子一样,如果这种期待没有被满足,就会产生一个错误。 注意:在SOAP 1.2规范中,SOAPAction header这个属性被"action"所取代,但其作用和工作原理都没有变化。 有意思的是,在Tibco的EAI工具BW中,使用SOAP服务端活动必须指定SOAP Action属性,如果引用的原始WSDL没有使用这个属性的话,也必须显示的指明;因此,相应的,其客户端也要注意啦——必须为SOAP Action属性填入期待的URI。
机器人 2012-07-27
  • 打赏
  • 举报
回复
建议 WCF 服务端发布时使用 soap1.1
  • 打赏
  • 举报
回复
貌似SoapHeader的问题,估计楼主重写了SoapHeader,请检查是否正确调用。
http://hi.baidu.com/lennon_tan/item/c40560f626dcd5b731c1992e

12,162

社区成员

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

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