服务器不能识别HTTP Header SOAPAction的值
[SoapRpcMethod(Action = "http://cyberindigo/TempWebService/InsertXML", RequestNamespace = "http://cyberindigo/TempWebService/Request", RequestElementName = "InsertXMLRequest", ResponseNamespace = "http://cyberindigo/TempWebService/Response", ResponseElementName = "InsertXMLResponse", Use = System.Web.Services.Description.SoapBindingUse.Literal)] [WebMethod] public string InsertXML(string Jobs) { return "Hi"; }
当我使用XMLHttpRequest访问它时出现以下错误:服务器无法识别HTTP Header SOAPAction的值: http:// Cyberindigo / TempWebService / InsertXML
这篇文章的下一部分的来源是:
http://bluebones.net/2003/07/server-did-not-recognize-http-header-soapaction/
(因为OP不想给出归属感谢Peter)
请注意,bakert是文本的原始作者,而不是OP。
在互联网上看不到任何地方,我可以find这个错误的解释,我想我会分享我长期search这个错误的成果。
这意味着(至less在我的情况下)您正在使用SOAP访问Web服务,并在HTTP请求中传递与该服务所期望的不匹配的SOAPAction参数。
因为我们把一个Web服务从一个服务器移到另一个服务器,所以我改变了调用C#文件中的“命名空间”(不要混淆networking服务命名空间和.net命名空间)以匹配新的服务器。 但服务器不关心http // yournamespace.com/blah的实际networking现实,它只关心你发送你所说的你期望在服务器上。 它并不在乎是否有任何东西。
所以基本上,Web服务从http://foo.com/servicename移动到http://bar.com/servicename,但Web服务的“名称空间”保留为http://foo.com/servicename,因为没有人改变它。
而这只需要大约4个小时的工作!
如果你有类似的问题,但不能工作,我在这里说什么,请随时给我发电子邮件bakert+web@gmail.com – 我不希望我的四个小时在任何人!
我同意Sam的意见,SOAP定义与预期不符。 这可能只是一个解决scheme,我不得不手动为自己找出这个错误:
我的问题是我改变了web方法的名字,但没有改变元数据标签中的“MessageName”。
[WebMethod(MessageName = "foo")] public string bar() { }
它应该是
[WebMethod(MessageName = "foo")] public string foo() { }
希望帮助别人
在调用.asmx / wcf Web服务时请注意以下几点:
- 命名空间区分大小写,SOAP请求必须与声明WebService的同一个命名空间一起发送。
例如对于如下所示的WebService
[WebService(Namespace = "http://MyDomain.com/TestService")] public class FooClass : System.Web.Services.WebService { [WebMethod] public bool Foo( string name) { ...... } }
在调用时,SOAP请求必须为名称空间维护相同的大小写。有时,我们会忽略区分大小写。
<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> <Foo xmlns="http://MyDomain.com/TestService"> <name>string</name> </Foo> </soap:Body> </soap:Envelope>
- 名称空间不必与服务的托pipeURL相同。名称空间可以是任何string。
例如,Above服务可以在http://84.23.9.65/MyTestService上托pipe,但是在从客户端调用Web服务时,名字空间应该与serice类所具有的相同,即http://MyDomain.com/TestService
我有同样的问题,它经过一些检查后固定:
<< Target WebService存在,但被称为方法不是eXXXist。 >>
我的本地服务包含方法,但目标服务器(连接服务器)不包含指定的调用方法。
再次检查你的程序场景…
为了解决这个问题,经过一个下午的debugging,问题是web服务是用framework 4.5开发的,android的调用必须用SoapEnvelope.VER12完成,而不是用SoapEnvelope.VER11
我有类似的问题。 为了debugging这个问题,我运行了Wireshark并捕获了我的代码生成的请求。 然后我使用XML Spy试验来创build一个SOAP请求(假设你有WSDL)并且比较这两个。
这应该给你一个提示什么错了。
我决定在这里发表我自己的答案,因为我已经在这方面损失了几个小时了,我认为,虽然接受的答案非常好,并指出我在正确的方向(是的,它得到了一个投票),这是不够详细,不足以解释我的应用程序出了什么问题,至less在我的情况下。
我在OpenESB 2.2中运行BPEL模块,我的复合应用程序的testing用例失败,出现以下错误:
Caused by: System.Web.Services.Protocols.SoapException: Server did not recognize the value of HTTP Header SOAPAction: .
在做了一些研究之后,我注意到外部WSDL有我们需要解决这个问题的所有线索,例如,我使用以下Web服务通过Web服务编排来validation信用卡号: http:// http://www.webservicex.net/CreditCard.asmx?WSDL
如果您检查<wsdl:operation
元素,您将看到它明确指出该操作的soapAction
:
<wsdl:binding name="CCCheckerSoap" type="tns:CCCheckerSoap"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="ValidateCardNumber"> <soap:operation soapAction="http://www.webservicex.net/ValidateCardNumber" style="document"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> ...
但是,一旦创build组合应用程序并使用调用此外部WSDL服务的BPEL构build项目,出于某种原因(错误?),将使用一个空的soapAction
参数生成组合应用程序服务组合(CASA)绑定的XML:
<binding name="casaBinding1" type="ns:CCCheckerSoap"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="ValidateCardNumber"> <soap:operation soapAction="" style="document"/> <input> <soap:body use="literal"/> </input>
一旦您将正确的soapAction(http://www.webservicex.net/ValidateCardNumber)复制到此参数中,应用程序的testing用例将正确并返回预期的Soap响应。;
<soap:operation soapAction="http://www.webservicex.net/ValidateCardNumber" style="document"/>
所以,这是一个更具体的解决scheme,我决定根据这篇博客中的信息进行文档化: http : //bluebones.net/2003/07/server-did-not-recognize-http-header-soapaction/ 。
这意味着(至less在我的情况下)您正在使用SOAP访问Web服务,并在HTTP请求中传递与该服务所期望的不匹配的SOAPAction参数 。
从Web服务中的“tempuri”更改命名空间后,我遇到了同样的问题。
您必须在使用上述服务的项目中更新服务引用,以便获取最新的SOAP定义。
或者至less为我工作。 🙂
我们重命名了一些我们的web服务项目命名空间,并忘记更新网站httphandlers config部分与重命名的项目的命名空间。
我的错误通过回答约翰·桑德斯先生解决: http : //forums.asp.net/post/2906487.aspx
简而言之:ws .asmx.cs的命名空间与ws .wsdl文件的区别。
1) [WebService(Namespace = "http://tempuri.org/")]
后来的Web服务名称空间更改为:
2) [WebService(Namespace = "http://newvalue.com/")]
所以我们在应用程序和Web服务中引用(1)是(2)。
让他们等于解决你的问题。
我不得不整理我的服务引用大写,删除引用,并重新添加它们来解决这个问题。 我不确定这些步骤是否是迷信的,但问题就消失了。
我有一个类似的问题与相同的错误消息:
System.Web.Services.Protocols.SoapException:
服务器无法识别HTTP Header SOAPAction
的值:
我们在我们的Web服务调用中使用dynamicURL。 我们有一个中央configuration服务器,pipe理所有Web服务调用的位置,以便我们的代码可以在DEV中运行,testing或生活,无需重新编译。 我们的configuration服务器中针对testing环境的特定Web服务调用的URL不正确。 Web服务调用被发送到错误的服务器和错误的Web服务。
所以这个错误可能只是Web服务请求与被调用的Web服务不匹配的结果。
在Web App服务器上运行提琴手,看到实际的调用是对不正确的Web服务。
问题是在服务中的System.Web.Services.Protocols.SoapDocumentMethodAttribute。 请检查一下。 它可能会改变。
我有同样的错误,我能够通过删除“Web引用”,并添加一个“服务引用”来解决它
当我试图调用一个不存在的方法时,我得到了这个错误。 它只存在于我们的webservice的新版本。