2014-10-01 2 views
0

Я использую Visual Studio 2013 для работы всех разработчиков.Xamarin Forms, не создающие ожидаемые типы возвращаемых данных из Webservice

У меня есть существующее приложение Windows 8, которое отлично работает с его веб-сервисом.

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

Существующие приложения:

public System.Threading.Tasks.Task<CompassESafe.eAuditService.DownloadAuditHeadersResponse> DownloadAuditHeadersAsXmlAsync(CompassESafe.eAuditService.DownloadAuditHeadersRequest request) { 
    return base.Channel.DownloadAuditHeadersAsXmlAsync(request); 
} 

Xamarin формы:

public void DownloadAuditHeadersAsXmlAsync(eAudit.eAuditService.DownloadAuditHeadersRequest request) { 
    this.DownloadAuditHeadersAsXmlAsync(request, null);  
} 

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

Есть ли что-то, что я делаю неправильно, когда создаю ссылку на службу в Xamarin Forms (или PCL). В качестве теста я удалил ссылку из существующего проекта и повторно добавил его, и он создается, как и ожидалось. У меня есть только эта проблема в моем проекте Xamarin.

Могу ли я сделать это в форматах Xamarin с помощью PCL или мне нужно использовать общий проект? Или Хасарин не допустит этого вообще?

Редактировать - Дополнительная информация: Как указано, новая автоматически сгенерированная функция не возвращает требуемый тип. Эти функции существуют, которые, кажется, возвращают то, что мне нужно, но я не уверен, как их использовать, может ли кто-нибудь пролить свет?

[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] 
    eAudit.eAuditService.DownloadAuditHeadersResponse eAudit.eAuditService.IDeviceService.EndDownloadAuditHeadersAsXml(System.IAsyncResult result) { 
     return base.Channel.EndDownloadAuditHeadersAsXml(result); 
    } 

    private System.IAsyncResult OnBeginDownloadAuditHeadersAsXml(object[] inValues, System.AsyncCallback callback, object asyncState) { 
     eAudit.eAuditService.DownloadAuditHeadersRequest request = ((eAudit.eAuditService.DownloadAuditHeadersRequest)(inValues[0])); 
     return ((eAudit.eAuditService.IDeviceService)(this)).BeginDownloadAuditHeadersAsXml(request, callback, asyncState); 
    } 

    private object[] OnEndDownloadAuditHeadersAsXml(System.IAsyncResult result) { 
     eAudit.eAuditService.DownloadAuditHeadersResponse retVal = ((eAudit.eAuditService.IDeviceService)(this)).EndDownloadAuditHeadersAsXml(result); 
     return new object[] { 
       retVal}; 
    } 

    private void OnDownloadAuditHeadersAsXmlCompleted(object state) { 
     if ((this.DownloadAuditHeadersAsXmlCompleted != null)) { 
      InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state)); 
      this.DownloadAuditHeadersAsXmlCompleted(this, new DownloadAuditHeadersAsXmlCompletedEventArgs(e.Results, e.Error, e.Cancelled, e.UserState)); 
     } 
    } 

    public void DownloadAuditHeadersAsXmlAsync(eAudit.eAuditService.DownloadAuditHeadersRequest request) { 
     this.DownloadAuditHeadersAsXmlAsync(request, null); 
    } 

    public void DownloadAuditHeadersAsXmlAsync(eAudit.eAuditService.DownloadAuditHeadersRequest request, object userState) { 
     if ((this.onBeginDownloadAuditHeadersAsXmlDelegate == null)) { 
      this.onBeginDownloadAuditHeadersAsXmlDelegate = new BeginOperationDelegate(this.OnBeginDownloadAuditHeadersAsXml); 
     } 
     if ((this.onEndDownloadAuditHeadersAsXmlDelegate == null)) { 
      this.onEndDownloadAuditHeadersAsXmlDelegate = new EndOperationDelegate(this.OnEndDownloadAuditHeadersAsXml); 
     } 
     if ((this.onDownloadAuditHeadersAsXmlCompletedDelegate == null)) { 
      this.onDownloadAuditHeadersAsXmlCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnDownloadAuditHeadersAsXmlCompleted); 
     } 
     base.InvokeAsync(this.onBeginDownloadAuditHeadersAsXmlDelegate, new object[] { 
        request}, this.onEndDownloadAuditHeadersAsXmlDelegate, this.onDownloadAuditHeadersAsXmlCompletedDelegate, userState); 
    } 
+0

Это, вероятно, более старый способ сделать асинхронный. Вместо задачи вы получаете обратный вызов. Что вы можете обернуть в Задаче, если хотите. –

+0

Спасибо за ваш ответ, я не совсем уверен, что вы имеете в виду, не могли бы вы представить пример, пожалуйста? – Rick

+0

Существуют ли методы, подобные EndDownloadAuditHeadersAsXmlAsync, или у DownloadAuditHeadersRequest есть что-то в этом роде? –

ответ

1

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

service.DownloadAuditHeadersResponse headersResponse = null; 
_serviceClient.DownloadAuditHeadersAsXmlCompleted += delegate(object o, eServ.service.DownloadAuditHeadersAsXmlCompletedEventArgs args) 
{ 
    headersResponse = args.Result; 
}; 

так что вместо вызова функции, чтобы вернуть нужный объект напрямую, вы подписаться на событие DownloadXxxCompleted, который возвращает объект.

+0

Это хороший способ пойти – SergioAMG