0

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

当我调用我的服务时,我的 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 和 Name

但我试图通过调用“GetProcessLocationsOnlyName”方法仅获取名称

我试图像下面那样做

array ProcName= ProcessLocationData.Name

应该返回服务中的所有名称,例如数组中的 (IL,MD,NY),但我根本看不到 ProcessLocationData。

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

请有人引导我走上正确的道路。在此先感谢。

4

1 回答 1

2

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

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

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

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

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

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

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

于 2012-05-31T09:32:41.583 回答