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参照の名前空間を変更するにはどうすればよいですか?
Web参照の削除と追加に加えて、提案されているようにwsdl.exeを使用してプロキシを再生成することもできます ここ 、名前空間を再度使用します。それが役に立てば幸い
Webサービスを呼び出すときにも同じ例外が発生しました。クライアントコードで、Webサービスを参照するために間違った名前空間を使用していました。そのため、WebServiceを参照するときは常に、Namespace.WebServiceのような完全修飾名を使用しました。これにより、問題が解決しました。
私の経験を共有することは、誰かを助けるかもしれないからです。
ケースを説明する例:
実際の方法:
[WebMethod]
public string Bar(){
}
名前をFoo
に変更しました
[WebMethod]
public string Foo(){
}
誤って呼び出されたメソッド:
objectName.Bar();
正しい呼び出し:
objectName.Foo();
実際のWebメソッドと呼び出されたメソッドの間で名前の競合(Webメソッドの名前が変更されたため)が問題を引き起こす可能性があります。
エラーを取得するもう1つの恥知らずな方法は、エンドポイントURLを動的に変更していて、wcfアドレスの代わりにasmxアドレスを入力した場合、またはその逆の場合です。
これは、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");
これらの両方のメソッドを同時に使用せずにサービスを呼び出すことはできませんでした。
これがお役に立てば幸いです。