卡住以调用 WCF 对象

本文关键字:WCF 对象 调用 | 更新日期: 2023-09-27 18:35:46

这很尴尬,试图自己找到解决方案,但真正缺乏知识我无法做到,所以我在这里发布我的问题。

我的 WCF 服务在调用我的服务时返回此值

   <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Body>
      <GetProcessLocationsResponse xmlns="http://tempuri.org/">
         <GetProcessLocationsResult >
            <a:ProcessLocationData>
               <a:Id>1</a:Id>
               <a:Name>IL</a:Name>
            </a:ProcessLocationData>
            <a:ProcessLocationData>
               <a:Id>2</a:Id>
               <a:Name>MD</a:Name>
            </a:ProcessLocationData>
            <a:ProcessLocationData>
               <a:Id>3</a:Id>
               <a:Name>NY</a:Name>
            </a:ProcessLocationData>
             </GetProcessLocationsResult>
      </GetProcessLocationsResponse>
   </s:Body>
</s:Envelope>

在我的服务类中,我编写了此方法

 public Array GetProcessLocations()
    {
        return this.GetSoapServiceClient().GetProcessLocations().ToArray();
    }
    public List<ProcessLocationData> GetProcessLocationsOnlyName()
    {
        return this.GetSoapServiceClient().GetProcessLocations().ToList();
    }

我在 XYZ 中调用此服务.class如下所示

 Array GetProcLocation=  new GatewayService().GetProcessLocations();

这将返回整个对象,如 ID 和名称

但我试图通过调用"获取进程位置仅名称"方法来获取名称

我试图像下面那样做

array ProcName= ProcessLocationData.Name

应该返回服务中的所有名称,例如数组中的 (IL,MD,NY),但我无法以查看进程位置数据。

以另一种方式,我试图拆分数组(GetProcLocation)并仅获取名称并添加到新数组中? 这有意义吗?

请有人引导我走上正确的道路,提前谢谢。

卡住以调用 WCF 对象

我对你的问题有点困惑。我知道您希望有 2 种服务方法,它们都返回一个 ProcessLocationData 数组,一个返回带有 id 和名称的列表 (GetProcessLocations),另一个返回一个仅包含名称的 ProcessLocationData 数组(GetProcessLocationsOnlyName)。您的问题是客户端代理不包含 GetProcessLocationsOnlyName 方法。

应确保这两种方法都使用 OperationContract 进行批注,否则服务不会公开它们。您应该在服务接口或直接在服务中具有此属性。可以看到您的服务在 wsdl 中或使用 WCF 测试客户端公开了这两种方法。

然后,您必须确保您的客户端代理是最新的。

  • 如果客户端代理是使用 Visual Studio 生成的,则应尝试更新服务引用
  • 如果您的客户端代理是使用 svcutil 生成的,则必须手动重新生成它

与您的注释相关,如果您只想返回名称字段,您有以下选项。

  • 您可以使用相同的 DataContract,这意味着返回 ProcessLocationData 的列表并为每个对象返回一个空 Id。
  • 可以创建一个只有一个属性 Name 的新数据协定,并返回这些对象的列表

我的建议是使用相同的数据协定,并在数据访问方法中仅加载所需的数据。例如,创建一个新方法 GetProcessLocationsName(),该方法将创建仅加载其名称的 ProcessLocationData 列表。