You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UWP添加服务引用后无法调用SOAP WebService方法,求解决方案

在UWP中调用SOAP WebService的解决方案

我懂你现在的困境——Android端用DependencyService调用SOAP服务顺顺当当,到UWP这边就卡壳找不到方法了对吧?这大概率是UWP平台的WCF客户端特性导致的,我来一步步帮你解决:

1. 先理清UWP WCF客户端的核心特性

UWP的服务引用默认只会生成异步方法(命名后缀一般是Async),而你共享接口里定义的是同步方法getWIValues,这就是你找不到对应方法的核心原因——服务生成的客户端根本没有同步版本的调用方法。

首先建议把共享接口改成异步模式,这更符合UWP的异步编程规范:

// 放在PCL/NetStandard项目的共享接口
public interface IGetWI
{
    Task<string[]> GetWIValuesAsync(string item);
}

2. 修正UWP端的DependencyService实现

接下来调整UWP的实现类,调用服务引用生成的异步方法,同时做好客户端的初始化和异常处理:

using System;
using System.ServiceModel;
using System.Threading.Tasks;
using Xamarin.Forms;

[assembly: Dependency(typeof(XXXXX.UWP.DependencyService.GetWI))]
namespace XXXXX.UWP.DependencyService
{
    public class GetWI : Interface.IGetWI
    {
        public async Task<string[]> GetWIValuesAsync(string item)
        {
            // 使用using确保客户端资源被正确释放
            using (var client = new GET_WI.WISWRProviderClient())
            {
                try
                {
                    // 调用服务生成的异步方法(注意方法名的Async后缀)
                    var serviceResult = await client.GetWIValuesAsync(item);
                    // 根据服务实际返回结构转换成string[],这里要匹配你的服务返回类型
                    return serviceResult?.ToArray() ?? Array.Empty<string>();
                }
                catch (FaultException ex)
                {
                    // 处理服务端抛出的SOAP异常
                    throw new Exception("服务调用出错: " + ex.Message);
                }
                catch (CommunicationException ex)
                {
                    // 处理通信类异常(比如网络不通、端点地址错误)
                    throw new Exception("通信失败: " + ex.Message);
                }
            }
        }
    }
}

3. 检查服务引用的配置细节

如果还是无法调用,先检查服务引用的配置:

  • 右键UWP项目里的GET_WI服务引用 → Configure Service Reference
  • 确认服务地址是正确的WSDL地址
  • 检查Collection type是否设置为System.Array(和你返回的string[]类型匹配)
  • 确保Generate asynchronous operations选项是勾选状态(默认是勾选的,可再次确认)

4. 特殊情况:必须保留同步接口的处理

如果因为项目限制必须保留同步接口(不推荐,UWP不鼓励同步阻塞操作),可以用异步转同步的方式,但要注意死锁风险:

public string[] getWIValues(string item)
{
    using (var client = new GET_WI.WISWRProviderClient())
    {
        try
        {
            var task = client.GetWIValuesAsync(item);
            task.Wait();
            return task.Result?.ToArray() ?? Array.Empty<string>();
        }
        catch (Exception ex)
        {
            // 捕获并抛出内层异常,方便排查问题
            throw ex.InnerException ?? ex;
        }
    }
}

最后必做的权限检查

别忘给UWP项目开网络权限:打开Package.appxmanifest → Capabilities,勾选Internet (Client)(公网服务)或者Private Networks (Client & Server)(内网服务)。

内容的提问来源于stack exchange,提问作者cocoadrinker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:05:06