MonoTouch не поддерживает метод OpenAsync для открытия соединения с веб-сервисом при работе на устройстве (работает на симуляторе) - PullRequest
3 голосов
/ 21 сентября 2011

Я использую MonoTouch 4.0.7 с MonoDevelop 2.8 Beta 2 и XCode 4 (кстати, кто-то знает, как получить версию MonoTouch 4.2?).Мы пытаемся вызвать метод веб-службы .Net через классы, созданные генератором прокси-сервера slsvcutil.

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

Однако при тестировании приложения на устройстве (iPhone4 с iOS 4.3.5), приложению не удается подключиться к серверу при вызове метода OpenAsynch () (метод вызывается из кода, сгенерированного генератором прокси), мы получаем странную ошибку:

Попытка JITМетод компиляции '(обернуть делегат-begin-invoke)' (обернуть делегат-begin-invoke): begin_invoke_IAsyncResult_ this __ TimeSpan_AsyncCallback_object (System.TimeSpan, System.AsyncCallback, object) 'при работе с --aot-only.

Мой стек ошибок:

Unhandled Exception: System.ExecutionEngineException: Attempting to JIT compile method '(wrapper delegate-begin-invoke) <Module>:begin_invoke_IAsyncResult__this___TimeSpan_AsyncCallback_object (System.TimeSpan,System.AsyncCallback,object)' while running with --aot-only.
at System.ServiceModel.MonoInternal.ClientRuntimeChannel.OnBeginOpen (TimeSpan timeout, System.AsyncCallback callback, System.Object state) [0x00000] in <filename unknown>:0 
at System.ServiceModel.Channels.CommunicationObject.BeginOpen (TimeSpan timeout, System.AsyncCallback callback, System.Object state) [0x00000] in <filename unknown>:0 
at System.ServiceModel.Channels.CommunicationObject.BeginOpen (System.AsyncCallback callback, System.Object state) [0x00000] in <filename unknown>:0 
at System.ServiceModel.ClientBase`1+ChannelBase`1[ICommandMgr,ICommandMgr].System.ServiceModel.ICommunicationObject.BeginOpen (System.AsyncCallback callback, System.Object state) [0x00000] in <filename unknown>:0 
at System.ServiceModel.ClientBase`
1[ICommandMgr].System.ServiceModel.ICommunicationObject.BeginOpen (System.AsyncCallback callback, System.Object state) [0x00000] in <filename unknown>:0 
at CommandMgrClient.OnBeginOpen (System.Object[] inValues, System.AsyncCallback callback, System.Object asyncState) [0x00000] in CommandMgrStaticProxyClient.cs:1156
 at System.ServiceModel.ClientBase`1[ICommandMgr].InvokeAsync (System.ServiceModel.BeginOperationDelegate beginOperationDelegate, System.Object[] inValues, System.ServiceModel.EndOperationDelegate endOperationDelegate, System.Threading.SendOrPostCallback operationCompletedCallback, System.Object userState) [0x00000] in <filename unknown>:0 
at CommandMgrClient.OpenAsync (System.Object userState) [0x00057] in CommandMgrStaticProxyClient.cs:1193 

Кто-то знает, является ли это ошибкой MonoTouch или есть способ исправить это падение?Заранее спасибо!

---- EDIT ----

Я нашел обходной путь: замените вызов OpenAsync () на Open ().Таким образом, я думаю, что это ограничение / ошибка MonoTouch, которая не поддерживает асинхронный вызов для открытия соединения с веб-службой.Я введу ошибку в bugzilla.xamarin.com

 private void DoNotificationMgrOpenAsync(string address, int port)
{
  this.SystemUIHandler.LogInfo(">>>>>> NotificationMgr Open");
  m_notificationMgrClient = new NotificationMgrClient(
    new System.ServiceModel.BasicHttpBinding() { Namespace = "http://schema.dartfish.com/2011/05/RemoteControl" },
    new System.ServiceModel.EndpointAddress(
      string.Format(System.Globalization.CultureInfo.InvariantCulture, "http://{0}:{1}/Dartfish/RemoteControlServices/",
      address, port)));
  //m_notificationMgrClient.OpenCompleted += new System.EventHandler<System.ComponentModel.AsyncCompletedEventArgs>(NotificationMgrClient_OpenCompleted);
  //m_notificationMgrClient.OpenAsync();

  m_notificationMgrClient.Open();
  DoGetLastMessageId();
}

void NotificationMgrClient_OpenCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
  this.SystemUIHandler.LogInfo("<<<<<< NotificationMgr Open");
  System.Diagnostics.Debug.Assert(m_notificationMgrClient != null);
  if (m_notificationMgrClient != null)
  {
    m_notificationMgrClient.OpenCompleted -= NotificationMgrClient_OpenCompleted;
    // init messageId
    DoGetLastMessageId();
  }
}

Ответы [ 2 ]

1 голос
/ 15 ноября 2012

Я считаю, что конкретная проблема такая же, как в этом посте с форума Unity 3D:

Проблема AOT с + = синтаксис обработчика событий

Как и в этомpost, сгенерированный асинхронный прокси-код использует синтаксис события + =, который требует JIT-компиляции.Я подтвердил, что исправление в посте решает эту проблему.

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

0 голосов
/ 21 сентября 2011

UPDATE

MonoTouch (сам по себе) использует одно из ограничений AOT MonoTouch.

немедленный обходной путь заключается в использовании синхронного метода Open (вместо OpenAsync метод).

A отчет об ошибке был открыт для отслеживания этой проблемы. Вы можете добавить себя в список c.c. , чтобы быть в курсе его прогресса.

...