前回のメモと同様に、悩ましくてしょうがない認証プロキシ相手で外部サービスを利用する際の方法です。今回は「諸般の事情」で 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 件のコメント:
コメントを投稿