前回のメモと同様に、悩ましくてしょうがない認証プロキシ相手で外部サービスを利用する際の方法です。今回は「諸般の事情」で config ファイルを利用しにくいケースに利用できる方法の一つになります。
実際のコードは以下の通りになります。
1: Dim client As [Service Interface] = Nothing
2: Try
3: Dim myBinding = New BasicHttpBinding()
4: Dim myEndpoint = New EndpointAddress([Service Address])
5: Dim myChannelFactory = New ChannelFactory(Of [Service Interface])(myBinding, myEndpoint)
6:
7: '認証プロキシの定義
8: myBinding.ProxyAddress = New Uri(string.Format("http://{0}:{1}", [Proxy Address], [Proxy Port]))
9: myBinding.UseDefaultWebProxy = false
10: myBinding.Security.Mode = BasicHttpSecurityMode.Transport
11: myBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None
12: myBinding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.Basic
13:
14: 'オレオレ証明書許可対応で呼ぶメソッド設定
15: 'ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(AddressOf CheckValidationResult)
16:
17: 'エンドポイントのデフォルト設定を削除
18: Dim defaultCredentials = myChannelFactory.Endpoint.Behaviors.Find(Of ClientCredentials)()
19: myChannelFactory.Endpoint.Behaviors.Remove(defaultCredentials)
20:
21: '認証プロキシの認証情報設定
22: ClientCredentials loginCredentials = New ClientCredentials()
23: loginCredentials.UserName.UserName = [Account]
24: loginCredentials.UserName.Password = [Password]
25:
26: 'チャンネルの作成
27: myChannelFactory.Endpoint.Behaviors.Add(loginCredentials)
28: client = myChannelFactory.CreateChannel()
29:
30: 'サービスの実行、結果の取得
31: Dim apiRet = client.[Service Method](New [Service Class](New [Service Body Class]([Parameter]))).Body.@return
32:
33: 'チャンネルの終了
34: DirectCast(client, ICommunicationObject).Close()
35:
36: Catch ex As Exception
37:
38: If client Is Not Nothing Then
39: DirectCast(client, ICommunicationObject).Abort()
40: End If
41:
42: End Try
43:
config ファイルを用いた初期化処理を、コードで力技にて実行する形ですね。
ポイントとなったのは認証情報の設定方法で、デフォルトで登録される設定を削除しておかないと、うまいこといかないという点です。
そしてここまで試した後で @kazuk さんよりすばらしい情報が・・・!
AppDomain を自分で作成することで、好きな場所の config ファイルを扱えるようになるとのことですので、これも試してみようと思います。
0 件のコメント:
コメントを投稿