我正在使用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);
}
这可能只是一种较古老的异步方式。而不是任务,你会得到一个回调。如果你愿意,你可以在Task中包装。 – 2014-10-01 18:50:27
感谢您的回复,我不完全确定您的意思,请您举个例子吗? – Rick 2014-10-02 08:52:27
有像EndDownloadAuditHeadersAsXmlAsync或DownloadAuditHeadersRequest类似的方法吗? – 2014-10-02 10:48:01