#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. Ссылка была сгенерирована неправильно. Обновление решило проблему