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

时间:2008-12-09 09:01:46

标签: c# javascript 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";
    }

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

17 个答案:

答案 0 :(得分:62)

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

  

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发送给我 - 我不希望我的任何人有四个小时!

答案 1 :(得分:6)

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

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

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

}

应该是

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

}

希望能帮到某人

答案 2 :(得分:5)

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

  1. 命名空间区分大小写,SOAP请求必须与声明WebService的相同命名空间一起发送。
  2. e.g。对于声明如下的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. 命名空间不必与服务的托管网址相同。命名空间可以是任何字符串。
    2. e.g。上述服务可以托管在http://84.23.9.65/MyTestService,但是在从客户端调用Web服务时,名称空间应该与serice类相同,即http://MyDomain.com/TestService

答案 3 :(得分:3)

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

<强>&LT;&LT;目标WebService存在,但调用方法不是eXXXists。 &GT;&GT;

  

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

再次检查您的计划方案......

答案 4 :(得分:3)

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

答案 5 :(得分:2)

我决定在这里发布我自己的答案,因为我已经失去了几个小时,我认为,虽然接受的答案非常好,并指出了正确的方向(是的,它得到了投票) ,它不够详细,无法解释我的申请有什么问题,至少在我的情况下。

我在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/

  

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

答案 6 :(得分:2)

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

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

答案 7 :(得分:1)

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

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

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

答案 8 :(得分:1)

我们已经重命名了一些我们的Web服务项目命名空间,忘了使用重命名项目的命名空间更新网站http handlers config部分。

答案 9 :(得分:1)

我的错误由John Saunders先生回答:http://forums.asp.net/post/2906487.aspx

简而言之:ws命名空间的区别 使用ws .asmx.cs .wsdl 文件。

1) [WebService(Namespace = "http://tempuri.org/")]

以后的Web服务命名空间更改为:

2) [WebService(Namespace = "http://newvalue.com/")]

所以我们在应用程序和Web服务中引用(1)现在是(2)。

使它们等于解决你的问题。

答案 10 :(得分:1)

我遇到了同样的错误,我可以通过删除“网络参考”来解决这个错误。并添加一个服务参考&#39;代替

答案 11 :(得分:1)

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

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

谢谢!

答案 12 :(得分:0)

我遇到了类似的问题,错误信息相同:

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

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

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

在Web App服务器上运行fiddler,看到实际的调用是针对不正确的Web服务。

答案 13 :(得分:0)

我必须整理我的服务引用的大写,删除引用并重新添加它们来修复它。我不确定这些步骤是否有任何迷信,但问题就消失了。

答案 14 :(得分:0)

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

答案 15 :(得分:0)

当我尝试调用不存在的方法时,我收到此错误。它只存在于我们的Web服务的新版本中。

答案 16 :(得分:0)

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