ログインするための WCF 呼び出しを行うことから始まるアプリケーションを作成しました。サービス参照を使用してクライアント コードを生成しました。サービスがネットワークにローカルにインストールされているクライアントでは問題なく機能します。ただし、これらの同じサービスが企業の力によって制御される SaaS 環境もあります。saas環境で、ログインに失敗しているとの連絡がありました。Fiddler を使用して調査したところ、ログインへのサービス呼び出しが HTML を返していることがわかりました。具体的には、.asmx から使用可能なすべてのメソッドをリストした Web ページです。
SaaS 環境には、ここで問題を引き起こしている可能性のある小さな癖が 1 つありますが、これが問題であることを確認する方法も、問題である場合の解決方法もわかりません。奇妙な点は、サーバーが呼び出しをリダイレクト (302) することです。
クライアントコード:
client.Endpoint.Address = new EndpointAddress("http://" + settings.MyURL + "/myProduct/webservices/webapi.asmx"); client.DoLogin(ユーザー名、パスワード);
リダイレクト前にサーバーに送信される生データには、s:Envelope XML タグが含まれています。リダイレクトされたサーバーに送信するときに、s:Envelope XML タグが欠落していることに注意してください。
GET https://www.myurl.com/myProduct/webservices/webapi.asmx HTTP/1.1 コンテンツ タイプ: テキスト/xml; 文字セット=utf-8 VsDebuggerCausalityData: uIDPo7TgjY1gCLFLu6UXF8SWAoEAAAAAQxHTAupeAkWz2p2l3jFASiUPHh+L/1xNpTd0YqI2o+wACQAA SOAPAction: " http://Interfaces.myProduct.myCompany.com/DoLogin " Accept-Encoding: gzip、デフレート ホスト: www.gotimeforce2.com 接続: キープアライブ
どうすればこのばかげたことを機能させることができますか?
編集:古い ASMX/wsdl.exe/web-reference ではなく、WCF/svcutil.exe/service-reference を使用していることは注目に値します。そうでなければ、このトピックの将来の読者にとって、Raj によって提案された wsdl ソリューションは優れたソリューションでした。この問題が発生し、wsdl 手法を使用している場合は、Raj の優れた回答を参照してください。
Edit2: WCF と 302 について一連の調査を行った後、それらがうまく連携していないように思えます。また、状況を処理するために WCF API カスタム コードを提供する簡単な方法もないようです。私はサーバーを制御できないため、サーバーを吸い上げて、Web 参照として API を再生成し、Raj のソリューションを使用しています。
Edit3:問題の原因が理解されたので、解決策をよりよく反映するようにタイトルを更新しました。元のタイトル: WCF がリダイレクトに s:Envelope を含めないのはなぜですか?