У меня есть служба WCF в качестве прокси, которая вызывает WebClient для возврата строки. WebClient запрашивает сервис токенов, где имя пользователя и пароль отправляются через https. Служба работает нормально, если имя пользователя и пароль верны, однако, если имя пользователя и пароль неверны, WebClient выдает исключение (403 Forbidden), которое ожидается и обрабатывается в приведенном ниже коде. однако служба 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.
Трассировки стека:
в System.ServiceModel.AsyncResult.End [TAsyncResult] (результат IAsyncResult)
в System.ServiceModel.Channels.ServiceChannel.EndCall (действие String, выходы Object [], результат IAsyncResult)
at System.ServiceModel.ClientBase 1.ChannelBase
1.EndInvoke (String methodName, Object [] args, результат IAsyncResult)
в MatrixWebMap.AuthServiceRef.AuthServiceClient.AuthServiceClientChannel.EndGetToken (результат IAsyncResult)
в MatrixWebMap.AuthServiceRef.AuthServiceClient.AuthServiceRef_AuthService_EndGetToken (результат IAsyncResult)
в MatrixWebMap.AuthServiceRef.AuthServiceClient.OnEndGetToken (результат IAsyncResult)
в System.ServiceModel.ClientBase`1.OnAsyncCallCompleted (результат IAsyncResult)
InnerException: System.Net.WebException
Сообщение = удаленный сервер возвратил ошибку: NotFound.
Трассировки стека:
в System.Net.Browser.AsyncHelper.BeginOnUI (SendOrPostCallback beginMethod, состояние объекта)
в System.Net.Browser.BrowserHttpWebRequest.EndGetResponse (IAsyncResult asyncResult)
в System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.CompleteGetResponse (результат IAsyncResult)
InnerException: System.Net.WebException
Сообщение = удаленный сервер возвратил ошибку: NotFound.
Трассировки стека:
в System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse (IAsyncResult asyncResult)
в System.Net.Browser.BrowserHttpWebRequest. <> c_ DisplayClassa.b _9 (Объект sendState)
в System.Net.Browser.AsyncHelper. <> c_ DisplayClass4.b _0 (объект sendState)
InnerException: