【问题标题】:Is it possible to use generic DataContract's from the client end?是否可以从客户端使用通用 DataContract?
【发布时间】:2011-07-13 20:48:36
【问题描述】:

我知道当您创建服务时,您可以创建通用 DataContract:

[DataContract(Name = "Get{0}Request")
public sealed class GetItemRequest<T>
    where T : class, new() { ... }

[DataContract(Name = "Get{0}Response")
public sealed class GetItemResponse<T>
    where T : class, new() { ... }

[ServiceContract]
public void MyService : IMyService
{
    [OperationContract]
    GetItemResponse<Foo> GetItem(GetItemRequest<Foo> request);
}

这将为我的 WSDL 生成 GetFooRequestGetFooResponse 定义。现在,我很好奇的是,是否有可能朝另一个方向发展?

是否可以创建一个使用 Generic DataContracts 的客户端并将其作为具体对象传递给服务器?我在添加服务参考后尝试了这个,但效果并不好。所以我更多的是想知道是否有任何方法(即使这意味着不添加服务引用)来做到这一点?

【问题讨论】:

  • 我承认这个功能(如here on MSDN 所述)是不是我以前见过的。很有趣。
  • @Marc:是的,但它只用了一半。负责 ServiceContractOperationContract 类的另一个团队在生成 Name 值时懈怠了,并且没有像 DataContract 那样对泛型进行很好的检查,因此为什么你不能创建具体定义的泛型运营/服务合同!也许是 C# 5? :)

标签: c# generics datacontract wcf


【解决方案1】:

最终,WCF 将查看合同类。如果它是从 WSDL/MEX 生成的,它不会有这个(因为这不是它在元数据中的表达方式)——但如果你的客户端有上面的代码,那么它应该可以正常工作。

如果您从客户端向您的 DTO dll 添加 引用(即 dll / 项目引用),并确保 WCF 启用了共享程序集,它应该可以工作。如果它仍然犹豫不决,那就作弊:使用服务引用只是为了获取配置数据。然后删除服务引用但保留配置(否则那些配置文件很痛苦)。然后它应该从库中找到类型。

【讨论】:

  • 我想我找到了我的问题。泛型类在它自己的命名空间MyNamespace.Common 中,具体定义在不同的命名空间MyNamespace.Services.XService 中生成。因此,在客户端,我仍然将泛型类留在MyNamespace.Common 定义中,因此我在要使用的正确命名空间中没有具体定义。基本上,它并没有我想象的那么有用,因为我仍然需要创建一个具体类型GetFooRequest : GetItemRequest&lt;T&gt;,为其添加一个 DataContract 属性(所以我不妨添加名称/命名空间)。
  • 似乎即使有可能,从客户端到服务器似乎不如从服务器到客户端有用。我将不得不再玩这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-10
  • 1970-01-01
  • 2011-11-08
  • 2011-02-24
  • 2020-12-16
  • 2017-05-31
  • 1970-01-01
相关资源
最近更新 更多