2008-12-09 83 views
35
[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"; 
    } 

的问题值:http://Cyberindigo/TempWebService/InsertXML服务器无法识别的HTTP标头SOAPAction的

回答

2

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

这应该给你一个提示什么错了。

+3

其他可以用来做同样事情的工具是Fiddler和/或SoapUI。 – 2010-10-12 22:44:19

+1

我用这个方法(Fiddler),发现我打了一个我的web服务的旧版本,它没有包含我的新方法。我的Web.Config仍指向一个旧的服务器。布莱什。 – Suamere 2014-06-16 19:17:24

58

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

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

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

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


看到,因为无处在互联网上我能找到这样的错误,我想我会分享我的长寻找这个bug的果实的解释。

这意味着(至少在我的情况),您的访问与SOAP Web服务和传递SOAPAction的参数不匹配什么服务期待的HTTP请求。

因为我们将Web服务从一台服务器移动到另一台服务器,因此我改变了调用C#文件中的“名称空间”(不要混淆Web服务名称空间和.net名称空间)以匹配新的服务器。但服务器并不关心http // yournamespace.com/blah的实际网络实际情况,它只关心你发送了你所说的你期望在服务器上的内容。它不关心是否有任何事物存在。

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

而这只需要大约4个小时的工作!

如果你有类似的问题,但不能工作,我在这里说什么,随意邮寄我的[email protected] - 我不希望任何人我的四个小时!

+1

我有一个类似的问题,其中Web Reference已经过时了服务。在Visual Studio中更新Web引用已将其清除。 – AlG 2011-12-07 13:07:17

+3

9年后,人们对此感到有趣。由于我的博客文章,我每个月都会收到几封有关此邮件的电子邮件。感谢归属jcolebrand :) – 2012-04-23 18:42:19

6

我与山姆同意了SOAP定义不匹配的期望是什么。这里只是一个解决方案可能是,我不得不手动算出这个错误我自己:

我的问题是,我改变了Web方法的名称,但在元数据标签并没有改变“MessageName”。

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

} 

应该

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

} 

希望帮助别人

0

我不得不整理一下我的服务参考市值,删除引用,并重新将它们添加到解决这个问题。我不知道如果有这些步骤都是迷信的,但问题就走开了。

5

虽然调用的.asmx/WCF Web服务,请采取以下点的护理:

  1. 命名空间是区分大小写,SOAP请求必须与该WebService的声明相同的命名空间来发送。

例如为WebService声明如下

[WebService(Namespace = "http://MyDomain.com/TestService")] 
public class FooClass : System.Web.Services.WebService 
{ 
    [WebMethod] 
    public bool Foo(string name)  
    { 

     ...... 
    } 

} 

而calling.Sometime我们忽略大小写的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> 
  • 命名空间不必是相同的服务。命名空间的托管URL可以是任意字符串。
  • 例如上述服务可在http://84.23.9.65/MyTestService托管,但仍同时从客户端调用Web Service的名称空间应该是其中的贡献莫过于类是具有即http://MyDomain.com/TestService

    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元素,你会清楚地看到它说明该o的soapAction peration:

    <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项目(?BUG),复合应用程序服务组装的XML(CASA)结合与空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:operation soapAction="http://www.webservicex.net/ValidateCardNumber" style="document"/> 
    

    所以,这是一个更具体的解决方案,我决定基于本博客文章中的信息记录:http://bluebones.net/2003/07/server-did-not-recognize-http-header-soapaction/

    It means (at least in my case) that you are accessing a web service with SOAP and passing a SOAPAction parameter in the HTTP request that does not match what the service is expecting.

    1

    我在我的Web服务中从“tempuri”更改名称空间后出现同样的问题。

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

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

    1

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

    3

    我有同样的问题,它修正了一些检查后:

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

    my local service contain methods but target server(connecting server) does not contain specified called method.

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

    0

    我也有类似的问题,同样的错误信息:

    System.Web.Services.Protocols.SoapException:服务器不承认HTTP头SOAPAction的价值:

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

    所以,这个错误可能只是Web服务请求与被调用的Web服务不匹配的结果。

    它在Web应用服务器上运行提琴手以查看实际调用的是不正确的Web服务。

    3

    只是为了帮助别人对这个问题,调试了一下午之后,问题是,网络服务与框架4.5开发,在Android通话必须SoapEnvelope.VER12而不是与SoapEnvelope.VER11

    完成
    1

    我的错误答案由约翰·桑德斯先生定: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/")] 
    

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

    使他们等于解决您的问题。

    0

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

    0

    我有同样的错误,我能够通过删除“Web引用”,并添加一个“服务引用”,而不是

    0

    我得到这个错误,解决它,当我试着打电话给并不存在的方法。它只存在于我们的web服务的更新版本中。

    相关问题