2

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;
4

1 に答える 1

1

ChannelFactoryCredentialsプロパティに資格情報を追加します

于 2012-08-03T07:24:06.617 に答える