繁体   English   中英

服务器无法识别 HTTP Header SOAPAction 的值

[英]Server did not recognize the value of 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 标头 SOAPAction 的值: http://Cyber​​indigo/TempWebService/InsertXML

这篇文章下一部分的来源是:

http://bluebones.net/2003/07/server-did-not-recognize-http-header-soapaction/

(因为 OP 不想给出归属,感谢彼得)

请注意,bakert 是文本的原作者,而不是 OP。


在互联网上找不到任何地方可以找到此错误的解释,我想我会分享我长期搜索此错误的成果。

这意味着(至少在我的情况下)您正在使用 SOAP 访问 Web 服务并在 HTTP 请求中传递与服务期望的不匹配的SOAPAction参数。

我陷入了困境,因为我们将 Web 服务从一台服务器移动到另一台服务器,因此我更改了调用 C# 文件中的“命名空间”(不要混淆 Web 服务命名空间和 .net 命名空间)以匹配新服务器。 但是服务器并不关心http://yournamespace.com/blah的实际网络现实,它只关心你发送它你所说的你期望在服务器上的内容。 它不在乎那里是否真的有任何东西。

所以基本上网络服务从http://foo.com/servicename移动到http://bar.com/servicename但网络服务的“命名空间”保持为http://foo.com/servicename因为没有人改变了它。

并且只用了大约 4 个小时就完成了!

如果您遇到了类似的问题,但无法解决我在这里所说的问题,请随时通过 bakert+web@gmail.com 给我发邮件——我不希望我的四个小时花在任何人身上!

在调用 .asmx / wcf 网络服务时,请注意以下几点:

  1. 命名空间区分大小写,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>
  1. 命名空间不必与服务的托管 url 相同。命名空间可以是任何字符串。

例如,上面的服务可能托管在http://84.23.9.65/MyTestService ,但仍然在从客户端调用 Web 服务时,命名空间应该与服务类具有的相同,即http://MyDomain.com/TestService

我同意 Sam 的观点,即 SOAP 定义与预期不符。 这只是一种解决方案,我必须自己手动计算这个错误:

我的问题是我更改了 Web 方法的名称,但没有更改元数据标记中的“MessageName”。

[WebMethod(MessageName = "foo")]
public string bar()
{

}

它应该是

[WebMethod(MessageName = "foo")]
public string foo()
{

}

希望能帮助某人

我决定在这里发布我自己的答案,因为我在这个问题上浪费了几个小时,我认为,虽然接受的答案非常好并为我指明了正确的方向(是的,它得到了投票),但它是不够详细,无法解释我的应用程序出了什么问题,至少在我的情况下是这样。

我在 OpenESB 2.2 中运行 BPEL 模块,我的复合应用程序的测试用例失败并出现以下错误:

Caused by: System.Web.Services.Protocols.SoapException: Server did not recognize the value of HTTP Header SOAPAction: .

在做了一些研究之后,我注意到外部 WSDL 具有解决这个问题所需的所有线索,例如,我使用以下 Web 服务通过 Web 服务的编排来验证信用卡号: 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>
...

但是,一旦您创建了复合应用程序并使用调用此外部 WSDL 服务的 BPEL 构建项目,出于某种原因(错误?),复合应用程序服务程序集 (CASA) 绑定的 XML 将使用空的soapAction参数生成:

<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) 复制到此参数中,应用程序的测试用例将正确并返回预期的Soap 响应。

<soap:operation soapAction="http://www.webservicex.net/ValidateCardNumber" style="document"/>

所以,这是一个更具体的解决方案,我决定根据这篇博文中的信息记录下来: http : //bluebones.net/2003/07/server-did-not-recognize-http-header-soapaction/

这意味着(至少在我的情况下)您正在使用 SOAP 访问 Web 服务并在 HTTP 请求中传递与服务期望的不匹配的 SOAPAction 参数

我有同样的问题,经过一些检查后解决了:

<< 目标 WebService 存在但被调用的方法不是 eXXXists。 >>

我的本地服务包含方法,但目标服务器(连接服务器)不包含指定的调用方法。

再次检查您的程序场景...

只是为了帮助某人解决这个问题,经过一个下午的调试,问题是 Web 服务是用框架 4.5 开发的,来自 android 的调用必须用 SoapEnvelope.VER12 完成,而不是用 SoapEnvelope.VER11

我有类似的问题。 为了调试问题,我运行了Wireshark并捕获了我的代码生成的请求。 然后我使用XML Spy 试验来创建一个 SOAP 请求(假设您有 WSDL)并比较这两个请求。

这应该会给你一个提示是什么地方出了问题。

我遇到了同样的问题,但对我来说,解决方案是我指向了错误的 Web 服务。 我已经正确更新了网络参考。 但是我们将服务的 URl 存储在加密文件中,并且我没有使用加密的正确服务更新文件。

但所有这些建议确实帮助我意识到去哪里调试。

谢谢!

在我的 Web 服务中从“tempuri”更改命名空间后,我遇到了同样的问题。

您必须在使用上述服务的项目中更新您的服务引用,以便它可以获得最新的 SOAP 定义。

或者至少这对我有用。 :)

我们重命名了一些 webservice 项目命名空间,但忘记使用重命名项目的命名空间更新网站 httphandlers 配置部分。

我的错误由 John Saunders 先生的回答修复: 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/")]

所以我们在 application 和 web service 中引用了 (1) 现在是 (2)。

让他们等于解决你的问题。

我遇到了同样的错误,我能够通过删除“Web 引用”并添加“服务引用”来解决它

当我尝试调用不存在的方法时出现此错误。 它只存在于我们的网络服务的较新版本中。

我有同样的错误消息的类似问题:

System.Web.Services.Protocols.SoapException:服务器无法识别 HTTP Header SOAPAction的值:

我们在 Web 服务调用中使用动态 URL。 我们有一个中央配置服务器来管理所有 Web 服务调用的位置,以便我们的代码可以在 DEV 中运行、测试或实时运行而无需重新编译。 在我们的配置服务器中,用于测试环境的特定 Web 服务调用的 URL 不正确。 Web 服务调用被发送到错误的服务器和错误的 Web 服务。

因此,此错误可能只是 Web 服务请求与被调用的 Web 服务不匹配的结果。

在 Web App 服务器上运行 fiddler 才发现实际调用的是不正确的 Web 服务。

问题出在服务中的 System.Web.Services.Protocols.SoapDocumentMethodAttribute 中。 请检查一下。 它可能会改变。

我发现我的 Web 引用已过期,并且代码正在调用已删除的 Web 服务。

我不得不整理我的服务引用的大小写,删除引用并重新添加它们来解决这个问题。 我不确定这些步骤中是否有任何一个是迷信的,但问题就解决了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM