2014-10-01 30 views
0

我正在使用Visual Studio 2013进行所有开发工作。Xamarin表单不能从Web服务创建预期的返回类型

我有一个现有的Windows 8应用程序,它的web服务正常工作。

我想在Xamarin Forms中利用这个现有的webservice构建一个移动应用程序。当我创建一个服务引用到这个Web服务时,我不会收到任何错误,并创建了引用。但是,在我的新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 Forms中使用PCL来做到这一点,还是我需要使用共享项目?或者Xamarin会不会允许这个?

编辑 - 更多信息: 如前所述,新的自动生成的函数不会返回所需的类型。这些函数似乎可以返回我需要的东西,但我不确定如何使用它们,请问任何人都可以摆脱任何光线?

[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

这可能只是一种较古老的异步方式。而不是任务,你会得到一个回调。如果你愿意,你可以在Task中包装。 – 2014-10-01 18:50:27

+0

感谢您的回复,我不完全确定您的意思,请您举个例子吗? – Rick 2014-10-02 08:52:27

+0

有像EndDownloadAuditHeadersAsXmlAsync或DownloadAuditHeadersRequest类似的方法吗? – 2014-10-02 10:48:01

回答

1

OK,所以很多的努力随机的东西使用来自Web服务所产生的新代码后,似乎答案其实很简单 - 我从来没有用过代表之前,所以这是新的东西给我。

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

所以不是调用一个函数直接返回所需的对象,你订阅,它返回对象的DownloadXxxCompleted事件。

+0

这是很好的方式去 – SergioAMG 2017-04-25 16:50:11