WSDLを使用せずにChannelFactory経由でSOAPサービスを呼び出しています。私はこのサービスの複数のバージョンを消費していると私はプロジェクト/設定ファイル内のWSDLの複数のバージョンを持つことを避けようとしています。次のようにWSDLを使用せずにChannelFactory経由でSOAPサービスを呼び出す
コードは次のとおりです。
私はSOAPリクエストとレスポンスが戻ってくるだけで罰金参照フィドラーを使用して[ServiceContract()]
public interface IServiceContract
{
[OperationContract(Name = "login")]
string login(string username);
}
public void UserLogin()
{
IServiceContract service = new ChannelFactory<IServiceContract>(
new BasicHttpBinding(),
"http://myurl.com/index.php/api/v2_soap/index/")
.CreateChannel();
var sessionId = service.login("username");
}
。しかし、ネームスペースの問題により、応答メッセージがデシリアライズされないことがあります。
エラーメッセージ: 「ログイン」操作の応答メッセージ本文をデシリアライズする際にエラーが発生しました。 OperationFormatterが無効なMessage本体を検出しました。名前 'loginResponse'と名前空間 'http://tempuri.org/'を持つノードタイプ 'Element'を見つけることが期待されます。見つかったノードタイプ「要素」の名前で「NS1:loginResponse」と名前空間「壷:foo」で
ので、同様に、私は名前空間を含めるために私のServiceContractを更新した場合:
[ServiceContract(Namespace="urn:Foo")]
public interface IServiceContract
{
[OperationContract(Name = "login")]
string login(string username);
}
エラーメッセージが離れて行くが、メソッドは実際の値の代わりにnullを返すようになりました。もう一度私はFiddlerでXMLを見ることができ、私が探している価値は応答にありますが、それでも要素ns1:loginResponseを見つけることができないようです。
問題は、与えられた名前空間のすべての要素にns1というプレフィックスが付いていることを知るために、どのようにChannelFactoryを設定するのですか?
私はサービスがWCFに実装されていないと仮定していますか?あなたはFiddlerでそれらを見ることができるように、リクエストとレスポンスの両方の例を投稿できますか? – mthierba