Асинхронный вызов WCF вызывает исключение, которое переходит к обработчику необработанных исключений — ни один из моих кодов в стеке вызовов

#c# #wcf #exception #windows-phone-7

#c# #wcf #исключение #windows-phone-7

Вопрос:

Я выполняю вызов WCF для ASP.NET из Windows Phone (7.0, 7.1 SDK). В некоторых случаях (я не мог заставить это произойти на эмуляторе или любом из моих устройств) обработчик необработанных исключений срабатывает для исключения, которое происходит в одном из этих вызовов (уточнение — это все на клиенте, а не на сервере). Я вижу два случая этого (они случаются довольно часто). У меня никогда раньше не возникало этой проблемы (ни в более старых версиях, ни в других приложениях, которые используют тот же код прокси-сервера WCF).

У кого-нибудь есть какие-либо идеи, почему это происходит и как? И что я могу сделать, чтобы обойти это?

Первый стек вызовов, в котором это происходит, это:

 System.ServiceModel.ProtocolException: The content type text/html of the response message does not match the content type of the binding (text/xml; charset=utf-8). If using a custom encoder, be sure that the IsContentTypeSupported method is implemented properly. The first 75 bytes of the response were: 'The page cannot be displayed because an internal server error has occurred.'. ---> System.Net.WebException: The remote server returned an error: NotFound. ---> System.Net.WebException: The remote server returned an error: NotFound.    at    
System.Net.Browser.ClientHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult)    at    
System.Net.Browser.ClientHttpWebRequest.<>c__DisplayClass2.<EndGetResponse>b__1(Object sendState)    at    
System.Net.Browser.AsyncHelper.<>c__DisplayClass4.<BeginOnUI>b__0(Object sendState)    at    
System.Reflection.RuntimeMethodInfo.InternalInvoke(RuntimeMethodInfo rtmi, Object obj, BindingFlags invokeAttr, Binder binder, Object parameters, CultureInfo culture, Boolean isBinderDefault, Assembly caller, Boolean verifyAccess, StackCrawlMarkamp; stackMark)    at    
System.Reflection.RuntimeMethodInfo.InternalInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, StackCrawlMarkamp; stackMark)    at    
System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)    at    
System.Delegate.DynamicInvokeOne(Object[] args)    at    
System.MulticastDelegate.DynamicInvokeImpl(Object[] args)    at    
System.Windows.Threading.Dispatcher.<>c__DisplayClass4.<FastInvoke>b__3()    at    
System.Reflection.RuntimeMethodInfo.InternalInvoke(RuntimeMethodInfo rtmi, Object obj, BindingFlags invokeAttr, Binder binder, Object parameters, CultureInfo culture, Boolean isBinderDefault, Assembly caller, Boolean verifyAccess, StackCrawlMarkamp; stackMark)    at    
System.Reflection.RuntimeMethodInfo.InternalInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, StackCrawlMarkamp; stackMark)    at    
System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)    at    
System.Delegate.DynamicInvokeOne(Object[] args)    at    
System.MulticastDelegate.DynamicInvokeImpl(Object[] args)    at    
System.Windows.Threading.DispatcherOperation.Invoke()    at    
System.Windows.Threading.Dispatcher.Dispatch(DispatcherPriority priority)    at    
System.Windows.Threading.Dispatcher.OnInvoke(Object context)    at    
System.Windows.Hosting.CallbackCookie.Invoke(Object[] args)    at    
System.Windows.RuntimeHost.ManagedHost.InvokeDelegate(IntPtr pHandle, Int32 nParamCount, ScriptParam[] pParams, ScriptParamamp; pResult)     at    
System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state)    at    
System.Net.Browser.ClientHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)    at    
System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.CompleteGetResponse(IAsyncResult result)    at    
System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.OnGetResponse(IAsyncResult result)    at    
System.Net.Browser.ClientHttpWebRequest.<>c__DisplayClassa.<InvokeGetResponseCallback>b__8(Object state2)    at    
System.Threading.ThreadPool.WorkItem.doWork(Object o)    at    
System.Threading.Timer.ring()     at    
System.ServiceModel.Channels.HttpChannelUtilities.ValidateRequestReplyResponse(HttpWebRequest request, HttpWebResponse response, HttpChannelFactory factory, WebException responseException)    at    
System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.ProcessResponse(HttpWebResponse response, WebException responseException)    at    
System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.CompleteGetResponse(IAsyncResult result)    at    
System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.OnGetResponse(IAsyncResult result)    at    
System.Net.Browser.ClientHttpWebRequest.<>c__DisplayClassa.<InvokeGetResponseCallback>b__8(Object state2)       
  

Второй обратный вызов, при котором это происходит, является:

 System.ServiceModel.EndpointNotFoundException: There was no endpoint listening at    
http://MyServer.com/Fail/FailService.svc that could accept the message. This is often caused by an incorrect address or SOAP action. See InnerException, if present, for more details. ---> System.Net.WebException: The remote server returned an error: NotFound. ---> System.Net.WebException: The remote server returned an error: NotFound.    at    
System.Net.Browser.ClientHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult)    at    
System.Net.Browser.ClientHttpWebRequest.<>c__DisplayClass2.<EndGetResponse>b__1(Object sendState)    at    
System.Net.Browser.AsyncHelper.<>c__DisplayClass4.<BeginOnUI>b__0(Object sendState)    at    
System.Reflection.RuntimeMethodInfo.InternalInvoke(RuntimeMethodInfo rtmi, Object obj, BindingFlags invokeAttr, Binder binder, Object parameters, CultureInfo culture, Boolean isBinderDefault, Assembly caller, Boolean verifyAccess, StackCrawlMarkamp; stackMark)    at    
System.Reflection.RuntimeMethodInfo.InternalInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, StackCrawlMarkamp; stackMark)    at    
System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)    at    
System.Delegate.DynamicInvokeOne(Object[] args)    at    
System.MulticastDelegate.DynamicInvokeImpl(Object[] args)    at    
System.Windows.Threading.Dispatcher.<>c__DisplayClass4.<FastInvoke>b__3()    at    
System.Reflection.RuntimeMethodInfo.InternalInvoke(RuntimeMethodInfo rtmi, Object obj, BindingFlags invokeAttr, Binder binder, Object parameters, CultureInfo culture, Boolean isBinderDefault, Assembly caller, Boolean verifyAccess, StackCrawlMarkamp; stackMark)    at    
System.Reflection.RuntimeMethodInfo.InternalInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, StackCrawlMarkamp; stackMark)    at    
System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)    at    
System.Delegate.DynamicInvokeOne(Object[] args)    at    
System.MulticastDelegate.DynamicInvokeImpl(Object[] args)    at    
System.Windows.Threading.DispatcherOperation.Invoke()    at    
System.Windows.Threading.Dispatcher.Dispatch(DispatcherPriority priority)    at    
System.Windows.Threading.Dispatcher.OnInvoke(Object context)    at    
System.Windows.Hosting.CallbackCookie.Invoke(Object[] args)    at    
System.Windows.RuntimeHost.ManagedHost.InvokeDelegate(IntPtr pHandle, Int32 nParamCount, ScriptParam[] pParams, ScriptParamamp; pResult)     at    
System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state)    at    
System.Net.Browser.ClientHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)    at    
System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.CompleteGetResponse(IAsyncResult result)    at    
System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.OnGetResponse(IAsyncResult result)    at    
System.Net.Browser.ClientHttpWebRequest.<>c__DisplayClassa.<InvokeGetResponseCallback>b__8(Object state2)    at    
System.Threading.ThreadPool.WorkItem.doWork(Object o)    at    
System.Threading.Timer.ring()     at    
System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(WebException webException, HttpWebRequest request, HttpAbortReason abortReason)    at    
System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.CompleteGetResponse(IAsyncResult result)    at    
System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.OnGetResponse(IAsyncResult result)    at    
System.Net.Browser.ClientHttpWebRequest.<>c__DisplayClassa.<InvokeGetResponseCallback>b__8(Object state2)    at    
System.Threading.ThreadPool.WorkItem.doWork(Object o)    at    
System.Threading.Timer.ring()    
  

Ответ №1:

Похоже, что ваш веб-сервер / служба может выйти из строя из-за возможных необработанных исключений. Я бы проверил журналы событий на веб-сервере, чтобы увидеть, есть ли случаи, когда IIS сообщает о сбоях.

Обновление для проясненного вопроса

Насколько я понимаю вопрос сейчас, проблема в том, что если веб-служба не работает, служба WCF создает исключение, которое может быть перехвачено только обработчиком необработанных исключений.

Я никогда не сталкивался с таким поведением, но я понимаю, почему это происходит, и у меня есть возможное решение. Запрос службы WCF запускается асинхронно, поэтому фактическое подключение и обработка происходят в потоке, который вы можете видеть в вашем стеке вызовов.

Если вы подключили событие завершения асинхронного метода, исключение должно быть передано в параметрах этому обработчику событий, а не выдаваться. Я считаю, что исключение будет выдаваться только в том случае, если обработчика нет, потому что платформа не знает, что еще делать с исключением.

Комментарии:

1. Проблема не в этом (сервер фактически не работал — не выдавал исключений) — проблема в том, что у клиента есть необработанное исключение, которое не может быть перехвачено нигде, кроме обработчика необработанных исключений — это не так, как это должно работать.

2. Прояснил вопрос. Спасибо за ответ.

3. Обновленный ответ с дополнительной информацией

4. Я подключаю событие завершения: (