服务器无法识别HTTP标头SOAPAction的值

use*_*070 41 javascript c# web-services

   [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";
    }
Run Code Online (Sandbox Code Playgroud)

当我使用XMLHttpRequest访问它时出现问题它给出了以下错误服务器无法识别HTTP标头SOAPAction的值:http:// Cyber​​indigo/TempWebService/InsertXML

小智 64

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

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

(因为OP不想给予归属,并且感谢Peter)

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


在互联网上看到无处可以找到这个错误的解释我想我会分享我长期搜索这个错误的成果.

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

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

所以基本上Web服务从http://foo.com/servicename移动到http://bar.com/servicename但Web服务的"命名空间"保持为http://foo.com/servicename,因为没有人改变了

而这只需要大约4个小时才能解决!

如果你遇到了类似的问题,但我在这里说的不行,请随时给我发bakert+web@gmail.com - 我不希望我的四个小时对任何人!

  • 有趣的是,人们在9年后碰到了这个.由于我的博文,我每个月都会收到几封关于此的电子邮件.感谢jcolebrand归属:) (5认同)
  • 在我的公司,我们安装了多个 Web 服务,因为它是一些客户在本地安装的内部 Web 应用程序。我们选择了一个随机命名空间,因为 URL 随每个客户端而变化。奇怪的是,今天之前我从未见过这个错误。曾经。当 Web 服务在较新版本的 .NET 中重写时,开发服务器上就会发生这种情况。显然,Web 服务命名空间不必与 URL 相同,重写服务的团队更改了命名空间。 (4认同)

小智 6

我同意Sam的观点,即SOAP定义与预期不符.这里只有一个解决方案,我不得不为自己手动计算这个错误:

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

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

}
Run Code Online (Sandbox Code Playgroud)

它应该是

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

}
Run Code Online (Sandbox Code Playgroud)

希望有人帮助


小智 5

在调用.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)    
     {

      ...... 
     }

 }
Run Code Online (Sandbox Code Playgroud)

在调用时,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>
Run Code Online (Sandbox Code Playgroud)
  1. 命名空间不必与服务的托管URL相同.命名空间可以是任何字符串.

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


the*_*o_r 5

我决定在这里发布我自己的答案,因为我在这个问题上浪费了几个小时,我认为,尽管接受的答案非常好并为我指明了正确的方向(是的,它得到了投票),但它是不够详细,无法解释我的申请有什么问题,至少就我而言。

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

引起原因:System.Web.Services.Protocols.SoapException:服务器无法识别 HTTP 标头 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>
...
Run Code Online (Sandbox Code Playgroud)

但是,一旦您创建了复合应用程序并使用调用此外部 WSDL 服务的 BPEL 构建了项目,由于某种原因(bug?),复合应用程序服务程序集 (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>
Run Code Online (Sandbox Code Playgroud)

将正确的soapAction ( http://www.webservicex.net/ValidateCardNumber ) 复制到此参数中后,应用程序的测试用例将正确并返回预期的Soap 响应。

<soap:operation soapAction="http://www.webservicex.net/ValidateCardNumber" style="document"/>
Run Code Online (Sandbox Code Playgroud)

因此,我决定根据此博客文章中找到的信息记录一个更具体的解决方案: http: //bluebones.net/2003/07/server-did-not-recognize-http-header-soapaction/

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


ya2*_*a23 2

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

这应该会提示您出了什么问题。

  • 您可以用来执行相同操作的其他工具是 Fiddler 和/或 SoapUI。 (3认同)
  • 我使用了这个方法(Fiddler),发现我正在访问我的网络服务的旧副本,其中不包含我的新方法。我的 Web.Config 仍然指向旧服务器。布莱赫。 (2认同)