System.Web.Services.Protocols.SoapException: Server did not

本文关键字:Server did not SoapException Web Services Protocols System | 更新日期: 2023-09-27 17:53:48

当我试图调用web服务上的方法时,出现了一个异常:

System.Web.Services.Protocols.SoapException: Server did not recognize the value of HTTP Header SOAPAction: http://localhost:53460/3Development/MyWebService.asmx/GetBasePath.
   at System.Web.Services.Protocols.Soap11ServerProtocolHelper.RouteRequest()
   at System.Web.Services.Protocols.SoapServerProtocol.RouteRequest(SoapServerMessage message)
   at System.Web.Services.Protocols.SoapServerProtocol.Initialize()
   at System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext context, HttpRequest request, HttpResponse response, Boolean& abortProcessing)

web服务的命名空间:

[WebService(Namespace = "http://internaltest.temp.us/MyWebService.asmx")]

我做了一些研究,发现这个异常流是因为项目中引用的web服务的命名空间与服务器web服务的命名空间不同,但我已经尝试删除web引用并在项目中再次添加它,但结果仍然是一样的。

我的情况与下面的文章类似:

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

从文章:

所以基本上web服务是从http://foo.com/servicename移过来的到http://bar.com/servicename,但是web服务的"命名空间"原来是http://foo.com/servicename,因为没人改。

问题是:

如何修改web引用的命名空间?

System.Web.Services.Protocols.SoapException: Server did not

除了删除和添加web-reference之外,您还可以尝试使用此处建议的wsdl.exe重新生成代理,并再次使用名称空间。希望能有所帮助

在调用webservice时也得到了相同的异常。在我的客户端代码中,我使用了错误的命名空间来引用WebService。因此,每当我被引用到WebService时,我都使用完全限定的名称,如:Namespace。WebService,它为我解决了这个问题

分享我的经验,因为这可能会帮助别人。

示例:

实际方法:

[WebMethod]
public string Bar(){
}

您将其重命名为Foo

[WebMethod]
public string Foo(){
}

错误调用方法:

objectName.Bar();

正确的电话:

objectName.Foo();

一个名称冲突(因为web方法的重命名)在实际的web方法和被调用的方法之间会导致这个问题。

另一种获得错误的无耻方式是,如果您动态更改端点url,并且您放入asmx地址而不是wcf地址,反之亦然。

当WS的SOAPAction属性值未设置(null)或在发送的请求中不正确时,可能会发生这种情况。我正在使用apache库连接到我当前项目中的服务,下面你可以找到我的解决方案/解决方案。

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
call = (Call) service.createCall();
call = setUseSOAPAction(true);

由于我的apache案例没有setSoapAction方法,我使用他们的setProperty方法并手动为该属性分配SOAPAction名称。

call.setProperty("SOAPAction", "expected SOAPAction value");
call.setSOAPActionURI("expected SOAPAction value");

如果不同时使用这两个方法,我就无法调用服务。