Visual Studio 2010でWCFを使用して、ベンダーのWebサービスに対してクライアントを作成しています。実装や構成を変更することはできません。
彼らのテストサーバーへのインストールに対して実行しても、問題はありませんでした。私は彼らのwsdlからサービス参照を追加し、コードにURLを設定して、次のように呼び出しました。
var client = new TheirWebservicePortTypeClient();
client.Endpoint.Address = new System.ServiceModel.EndpointAddress(webServiceUrl);
if (webServiceUsername != "")
{
client.ClientCredentials.UserName.UserName = webServiceUsername;
client.ClientCredentials.UserName.Password = webServicePassword;
}
TheirWebserviceResponse response = client.TheirOperation(myRequest);
シンプルでわかりやすい。それを本番サーバーに移動し、httpsを使用するように構成するまで。次に、このエラーが発生しました:
The HTTP request is unauthorized with client authentication scheme 'Anonymous'. The authentication header received from the server was 'Basic realm='.
それで私は助けを探しに行きました。私はこれを見つけました:wcfを使用した基本認証でWebサービスを呼び出すことはできません。
承認された回答はこれを示唆しました:
BasicHttpBinding binding = new BasicHttpBinding();
binding.SendTimeout = TimeSpan.FromSeconds(25);
binding.Security.Mode = BasicHttpSecurityMode.Transport;
binding.Security.Transport.ClientCredentialType =
HttpClientCredentialType.Basic;
EndpointAddress address = new EndpointAddress(your-url-here);
ChannelFactory<MyService> factory =
new ChannelFactory<MyService>(binding, address);
MyService proxy = factory.CreateChannel();
proxy.ClientCredentials.UserName.UserName = "username";
proxy.ClientCredentials.UserName.Password = "password";
これも十分に単純に見えました。上記の「MyService」の代わりに使用する必要があるサービス参照を作成するために、wsdlから生成された多数のクラスとインターフェースのどれを見つけようとしているのかを除いて。
私が最初に試したのは、以前のバージョンでインスタンス化したクラスである「TheirWebservicePortTypeClient」を使用することでした。それは私に実行時エラーを与えました:
The type argument passed to the generic ChannelFactory class must be an interface type.
そこで、生成されたコードをもう少し掘り下げました。これを見た:
public partial class TheirWebservicePortTypeClient
:
System.ServiceModel.ClientBase<TheirWebservicePortType>,
TheirWebservicePortType
{
...
}
そこで、TheirWebservicePortTypeを使用してChannelFactory<>をインスタンス化してみました。
これにより、コンパイル時エラーが発生しました。結果のプロキシには、ClientCredentialsメンバーまたはTheirOperation()メソッドがありませんでした。
そこで、「System.ServiceModel.ClientBase」を試してみました。
それを使用したインスタンス化ChannelFactory<>でも、コンパイル時エラーが発生しました。結果のプロキシにはClientCredentialsメンバーが含まれていましたが、TheirOperation()メソッドは含まれていませんでした。
それで、何が得られますか?WCFクライアントからHTTPSWebサービスにユーザー名/パスワードを渡すにはどうすればよいですか?
====================ソリューションを説明するために編集====================
まず、提案されているように、TheirWebservicePortTypeを使用してファクトリをインスタンス化し、ユーザー名とパスワードをproxy.ClientCredentialsではなくfactory.Credentialsに追加します。少しの混乱を除いて。
wsdlの記述方法がおかしいのかもしれませんが、クライアントクラスTheirWebservicePortTypeClientは、TheirOperationをRequest引数を取り、Response結果を返すものとして定義しました。theirWebservicePortTypeインターフェースは、TheirOperation_Input引数を取り、TheirOperation_Output結果を返すものとしてTheirOperationを定義しました。ここで、TheirOperation_Inputには要求メンバーが含まれ、TheirOperation_Outputには応答メンバーが含まれていました。
いずれにせよ、渡されたRequestからTheirOperation_Inputオブジェクトを作成した場合、プロキシへの呼び出しは成功し、返されたTheirOperation_Outputオブジェクトから含まれているResponseオブジェクトを抽出できます。
TheirOperation_Output output = client.TheirOperation(new TheirOperation_Input(request));
TheirWebserviceResponse response = output.TheirWebserviceResponse;