WebClientを呼び出して文字列を返すプロキシとしてWCFサービスがあります。 WebClientは、ユーザー名とパスワードがhttps経由で送信されるTokenサービスを照会しています。 UsernameとPasswordが正しい場合、サービスはうまく動作しますが、ユーザー名とパスワードが無効な場合、WebClientは、以下のコードで予想され処理される例外(403 Forbidden)をスローします。しかしWCFサービスは、タイムアウトするまでハングアップして、なぜそれがわからないのか把握します。WebClientが例外を返す場合、WCFサービスがタイムアウトします。
Public Function GetToken(un As String, pw As String, ref As String) As TokenResult Implements IAGSAuthentication.GetToken
Dim Token As String
Dim TokenURL As String = String.Format("https://server/arcgisserver/tokens?request=getToken&username={0}&password={1}&timeout={2}", un, pw, Timeout)
Dim tokenResult As TokenResult = New TokenResult
If TokenService.IsBusy = False Then
Try
Token = TokenService.DownloadString(New Uri(TokenURL))
tokenResult.Token = Token
Return tokenResult
Exit Function
Catch ANEx As ArgumentNullException
TokenService.Dispose()
tokenResult.TokenException = ANEx
Return tokenResult
Exit Function
Catch WEx As WebException
TokenService.Dispose()
tokenResult.TokenException = WEx
Return tokenResult
Exit Function
Catch CEx As CommunicationException
TokenService.Dispose()
tokenResult.TokenException = CEx
Return tokenResult
Exit Function
Catch Ex As Exception
TokenService.Dispose()
tokenResult.TokenException = Ex
Return tokenResult
Exit Function
End Try
End If
Return tokenResult
End Function
WCFリファレンスファイルをデバッグイムは私に自動取り込まクライアント側メソッドで例外を示していたとき、私はまたことを追加する必要があります。
Public Function EndGetToken(ByVal result As System.IAsyncResult) As AuthServiceRef.TokenResult Implements AuthServiceRef.AuthService.EndGetToken
Dim _args((0) - 1) As Object
Dim _result As AuthServiceRef.TokenResult = CType(MyBase.EndInvoke("GetToken", _args, result),AuthServiceRef.TokenResult)
Return _result
End Function
私の事はある、私は、WCFサービスで例外を処理し、カスタムクラス内で例外を返すことで、私は問題なしとランタイムユーザーまでの例外をプッシュすることができていると考えていることです。ここで例外がキャッチされたクライアント側です:
System.ServiceModel.CommunicationException was unhandled by user code
メッセージ=リモートサーバーがエラーを返しました:NotFound。 のStackTrace:System.ServiceModel.AsyncResult.End [TAsyncResult](たIAsyncResult結果)で System.ServiceModel.Channels.ServiceChannel.EndCallでSystem.ServiceModel.ClientBase 1.ChannelBase
で (文字列アクションは、[]アウト、たIAsyncResult結果オブジェクト) MatrixWebMap.AuthServiceRef.AuthServiceClientでMatrixWebMap.AuthServiceRef.AuthServiceClient.AuthServiceRef_AuthService_EndGetToken(たIAsyncResult結果) でMatrixWebMap.AuthServiceRef.AuthServiceClient.AuthServiceClientChannel.EndGetToken(たIAsyncResult結果) で1.EndInvoke(文字列methodNameの、オブジェクト[]引数、たIAsyncResult結果) .OnEndGetToken(IAsyncResult result) at System.ServiceModel.ClientBase`1.OnAsyncCallCompleted(IAsyncResult result) Inne rException:System.Net.WebException メッセージ=リモートサーバーがエラーを返しました:NotFound。 のStackTrace:System.Net.Browser.AsyncHelper.BeginOnUIで (SendOrPostCallback beginMethod、オブジェクト状態) System.Net.Browser.BrowserHttpWebRequest.EndGetResponse(たIAsyncResult asyncResult) でSystem.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequestました。 CompleteGetResponse(IAsyncResult result) InnerException:System.Net.WebException メッセージ=リモートサーバーがエラーを返しました:NotFound。 StackTrace: at System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult) at System.Net.Browser.BrowserHttpWebRequest <> c_ DisplayClassa.b _9(Object sendState) at System.Net.Browser.AsyncHelper。 <> C_ DisplayClass4.b _0(sendStateオブジェクト) のInnerExceptionは:
おそらく、あなたはTokenServiceを処分するからでしょうか? –
disposeメソッドをコメントアウトすると何も変更されませんでした。 – BrokenRobot
例外は何ですか? –