Web サービスを使用する VB.NET (2008) コンソール アプリケーションがあります。私はもともと、System.Web.Services.Protocols.SoapHttpClientProtocol に基づいてクラスを作成する WSDL.exe (または Visual Studio の「Web サービスの追加」) を使用して WSDL をインポートする古い/レガシー (WCF 以前) のテクノロジを使用して書き始めました。 . しかし、これが最善の方法ではないことにすぐに気付きました (以前の質問 - How to get serialized XML of object passed to web service?での John Saunders のコメントのおかげです)。
そのため、コードを WCF に変換しました (System.ServiceModel.ClientBase に基づいてクラスを作成する「サービス参照の追加」を使用)。1 つの重要なポイントを除いて、多かれ少なかれ同じように機能します。それはセキュリティです。
私が利用している Web サービスは Java で書かれています。そして、私たち (私と Web サービスを開発したチーム) は同じ会社で働いていますが、彼らが Web サービスをどのように公開して公開するかについて、私はあまり制御できません。彼らの要件は、HTTPS ではなく、HTTP 経由でユーザー名とパスワード (基本 HTTP 認証) を渡すことです。それが最も安全な方法ではないことはわかっています。しかし、それは私が今戦うことができない戦いです。
これは、古い方法を使用してうまく機能しました。しかし、app.config でこれを設定して WCF でこれを実行しようとすると、次のようになります。
<security mode="Transport">
<transport clientCredentialType="Basic" />
</security>
...そして、次のようなコードでユーザー名とパスワードを設定します。
oServiceClient.ClientCredentials.UserName.UserName = "SomeUsername"
oServiceClient.ClientCredentials.UserName.Password = "SomePassword"
私はこの例外を丁寧にスローしました:
System.ArgumentException: The provided URI scheme 'http' is invalid; expected 'https'. Parameter name: via
それはひどいです。また、StackOverflow や他のサイトを検索しても、.NET 3.5 でこれを回避する方法はあまり見つかりません。有望かもしれないと思ったものを見つけました(http://webservices20.blogspot.com/2008/11/introducing-wcf-clearusernamebinding.html); ただし、このソリューションでは、サービス側とクライアント側の両方で構成を変更する必要があるようです。前述したように、私はこのサーバー側を制御することはできません。
WCF ベースのクライアントを使用してこれを達成する方法はありますか? それともあきらめて元のやり方に戻る必要がありますか?
編集:私はこれでいくつかの成功を収めているようです:
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Basic" />
<message clientCredentialType="UserName" />
</security>
しかし、このセキュリティ モード (TransportCredentialOnly) は、Microsoft のヘルプ記事やチュートリアルでは参照されていないようです。私は正しい木に向かって吠えていますか?