【问题标题】:Xamarin Forms not creating the expected return types from a WebserviceXamarin Forms 未从 Web 服务创建预期的返回类型
【发布时间】:2015-01-05 20:03:46
【问题描述】:

我使用 Visual Studio 2013 进行所有开发工作。

我有一个现有的 Windows 8 应用程序,可以很好地与它的网络服务配合使用。

我正在尝试在 Xamarin Forms 中构建一个利用此现有 Web 服务的移动应用程序。当我创建对此 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);    
}

如您所见,返回类型完全不同,已更改为 void,所以显然我无法按预期使用它。

当我在 Xamarin Forms(或 PCL)中创建服务引用时,我做错了什么吗?作为测试,我从现有项目中删除了引用并重新添加它,它按预期创建。我的 Xamarin 项目中只有这个问题。

我可以使用 PCL 在 Xamarin Forms 中执行此操作,还是需要使用共享项目?还是 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 你得到一个回调。如果您愿意,可以将其包装在 Task 中。
  • 感谢您的回复,我不太清楚您的意思,您能提供一个例子吗?
  • 有 EndDownloadAuditHeadersAsXmlAsync 之类的方法吗,或者 DownloadAuditHeadersRequest 有类似的方法吗?
  • 为问题添加了更多信息 - 谢谢

标签: c# android ios web-services xamarin


【解决方案1】:

好的,所以在尝试了很多随机的东西来使用从 web 服务生成的新代码之后,似乎答案实际上很简单——我以前从未使用过委托,所以这对我来说是新事物。

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

因此,您无需调用函数直接返回所需的对象,而是订阅返回对象的 DownloadXxxCompleted 事件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 2021-05-05
    • 2012-11-15
    相关资源
    最近更新 更多