Служба WCF истекает, если WebClient возвращает исключение - PullRequest
0 голосов
/ 24 февраля 2012

У меня есть служба 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:

1 Ответ

0 голосов
/ 27 февраля 2012

Итак, из того, что я собираю, когда добавляю исключение в класс TokenResult и возвращаю его, в ответе WCF возникла проблема со свойством исключения.Обходной путь заключался в том, чтобы обработать исключение перед ответом и сделать TokenException строкой, которая создается до получения результата.

Итак, для веб-исключения '403 Forbidden' я просто создал строку и возвратил"Информация, которую вы ввели, не соответствует нашим записям.Пожалуйста, попробуйте еще раз. "Вид грязной работы вокруг, но это идеально подходит для того, что я пытаюсь сделать здесь.

            Try
                Token = TokenService.DownloadString(New Uri(TokenURL))
                tokenResult.Token = Token
                Return tokenResult
                Exit Function

            Catch ANEx As ArgumentNullException                
                tokenResult.TokenException = ANEx.Message
                Return tokenResult
                Exit Function

            Catch WEx As WebException                   
                If WEx.Status = WebExceptionStatus.ProtocolError Then
                    tokenResult.TokenException = "The information you have entered does not match our records. Please try again."
                Else
                    tokenResult.TokenException = WEx.Message
                End If
                Return tokenResult
                Exit Function

            Catch CEx As CommunicationException      
                tokenResult.TokenException = CEx.Message
                Return tokenResult
                Exit Function

            Catch Ex As Exception                    
                tokenResult.TokenException = Ex.Message
                Return tokenResult
                Exit Function
            End Try
...