WCF для Windows phone 8.1 silverlight

#c# #wcf #silverlight #windows-phone-8.1

#c# #wcf #silverlight #windows-phone-8.1

Вопрос:

У меня возникли проблемы с использованием wcf с wp8.1 silverlight. Я постоянно получаю сообщение об ошибке, что контракт ‘IPhoneService’ содержит синхронные операции, которые не поддерживаются в Silverlight. Разделите операции на части «Begin» и «End» и установите свойству AsyncPattern атрибута OperationContract значение ‘true’. Обратите внимание, что вам не обязательно вносить те же изменения на сервере. После того, как я изменил свой синхронный метод на асинхронный, я все еще получаю ту же ошибку (я обновил ссылку на службу.). Из любопытства я попытался использовать его в консольном приложении, и оно отлично работает. Ранее я получал другую ошибку, которая могла иметь к этому какое-то отношение. При добавлении ссылки на службу был создан файл app.config, но приложению требовались ссылки на службу.ClientConfig, поэтому я просто переименовал его.

На данный момент я снова изменил метод WCF на syncronous:

 public int GetData()
        {
            return 12;
        }
  

и в моей MainViewModel (я использую MVVMLight toolkit):

  public void Load()
        {
            var client = new ServiceReference1.PhoneServiceClient();
            client.GetDataCompleted  = client_GetDataCompleted;
            client.GetDataAsync();
        }

        void client_GetDataCompleted(object sender, ServiceReference1.GetDataCompletedEventArgs e)
        {
            Title = e.Result.ToString();
        }
  

и я внедрил перед асинхронным методом, подобным этому, в любом случае получая ту же ошибку:

  public IAsyncResult BeginGetData(AsyncCallback callback, object asyncState)
        {
            var msg = 12;
            return new CompletedAsyncResult<int>(msg);
        }

        public int EndGetData(IAsyncResult r)
        {
            CompletedAsyncResult<int> result = r as CompletedAsyncResult<int>;            
            return result.Data;
        }

        class CompletedAsyncResult<T> : IAsyncResult
        {
            T data;

            public CompletedAsyncResult(T data)
            { this.data = data; }

            public T Data
            { get { return data; } }

            #region IAsyncResult Members
            public object AsyncState
            { get { return (object)data; } }

            public WaitHandle AsyncWaitHandle
            { get { throw new Exception("The method or operation is not implemented."); } }

            public bool CompletedSynchronously
            { get { return true; } }

            public bool IsCompleted
            { get { return true; } }
            #endregion
        }
  

Ответ №1:

Проблема была в версии VS2013 RC2. Ссылка была сгенерирована неправильно. Обновление решило проблему