web-dev-qa-db-ja.com

System.Web.Services.Protocols.SoapException:サーバーがHTTPヘッダーSOAPActionの値を認識しませんでした:

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参照の名前空間を変更するにはどうすればよいですか?

8
User2012384

Web参照の削除と追加に加えて、提案されているようにwsdl.exeを使用してプロキシを再生成することもできます ここ 、名前空間を再度使用します。それが役に立てば幸い

7

Webサービスを呼び出すときにも同じ例外が発生しました。クライアントコードで、Webサービスを参照するために間違った名前空間を使用していました。そのため、WebServiceを参照するときは常に、Namespace.WebServiceのような完全修飾名を使用しました。これにより、問題が解決しました。

2
Sunil P

私の経験を共有することは、誰かを助けるかもしれないからです。

ケースを説明する例:

実際の方法:

[WebMethod]
public string Bar(){
}

名前をFooに変更しました

[WebMethod]
public string Foo(){
}

誤って呼び出されたメソッド:

objectName.Bar();

正しい呼び出し:

objectName.Foo();

実際のWebメソッドと呼び出されたメソッドの間で名前の競合(Webメソッドの名前が変更されたため)が問題を引き起こす可能性があります。

1
student

エラーを取得するもう1つの恥知らずな方法は、エンドポイントURLを動的に変更していて、wcfアドレスの代わりにasmxアドレスを入力した場合、またはその逆の場合です。

0
mechanicum

これは、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");

これらの両方のメソッドを同時に使用せずにサービスを呼び出すことはできませんでした。

これがお役に立てば幸いです。

0
Umut Uzun