C# 以DataContracts作为参数的WCF多服务#

C# 以DataContracts作为参数的WCF多服务#,c#,.net,wcf,datacontract,C#,.net,Wcf,Datacontract,我有多个DataContracts和相同数量的WCF服务来管理每个方法。我有一个特定的[DataContract]名为User,我在其他所有服务中都使用它作为参数,例如:列出公司(用户,公司ID) 当make a service引用WCF service Company时,它有一个[DataContract]用户也像Company.User,这与原始的用户不同。有什么方法可以解决这个问题吗?逻辑上相同的DataContract,用于多个服务中 您可能正在使用Add service Referen

我有多个
DataContracts
和相同数量的WCF服务来管理每个方法。我有一个特定的
[DataContract]
名为
User
,我在其他所有服务中都使用它作为参数,例如:
列出公司(用户,公司ID)

当make a service引用WCF service Company时,它有一个
[DataContract]用户
也像
Company.User
,这与原始的
用户
不同。有什么方法可以解决这个问题吗?

逻辑上相同的DataContract,用于多个服务中 您可能正在使用Add service Reference为WCF服务客户端以通常的方式添加服务引用。。。菜单选项。执行此操作时,将为每个服务生成一个
Reference.cs
文件,并且每个服务将具有不同的命名空间。但是,由于您正在跨服务共享合同,因此需要单击高级。。。按钮,并确保选中了引用程序集中的重用类型,以及(最简单的)确保选中了所有引用程序集中的重用类型

现在,如果您实际上没有对包含这些
[DataContract]
类的程序集的常规项目或程序集引用,那么这将不起作用。所以,添加这些引用。如果这些类混合到服务器端实现中,则需要将它们移动到它们自己的程序集,并在客户端和服务器上引用它们

逻辑上不同的DataContract,用于多LPE服务 如果您确实有两种不同类型的用户(即两种不同的合约),其中一种合约用于一个服务客户端,另一种合约用于另一个服务客户端,则应确保未选中引用程序集中的重用类型,并确保每个服务引用位于不同的命名空间中

另一种方法是在声明它们时为每一个使用不同的名称:

[DataContract(Name = "User"]
public class User { ... }

[DataContract(Name = "CompanyUser")]
public class User { .... }

上面的代码假设每个
用户
类都位于不同的服务器端命名空间中,可能也位于不同的程序集中。

我建议您应该寻找一种更好的方法来使用WCF服务,即添加服务引用。这篇黄金文章描述了如何在所有解决方案之间共享数据契约,并通过使用香奈儿工厂来利用它们,而无需VS为您生成大量代码

它似乎有很多值得学习的地方,但它充满了真正有用的技巧,包括无魔法的服务访问,如下所示:

现在我们可以将注意力转向客户机应用程序。首先,, 让我先提醒大家,你不应该使用 在VisualStudio中为神奇服务客户端添加服务引用 创造这段代码极其冗长,难以管理 很容易被覆盖,而且它几乎总是用作 没有真正学习WCF的借口。没有什么比这更糟糕的了 不得不与那些只知道产品的人打交道 因为他们知道如何使用鼠标。朱瓦尔的死是有原因的 洛伊在他所有的书和演讲中都反复告诉人们要避免 使用这个有缺陷的功能。幸运的是,作为专业人士,我们拥有 能够理解如何在没有魔法的情况下做事

正如我已经多次提到的,WCF依赖于 美国广播公司。我们已经了解了如何通过创建端点来配置WCF主机 指定地址、绑定和合同。事实证明,这是 所有这些都是客户端所需要的。对于.NET和 Silverlight,将地址和绑定与 通道工厂创建一个通道。这不仅仅是幻想 架构师说,这正是您的代码的样子( 下面是什么的.NET版本 我的意思是:

BasicHttpBinding BasicHttpBinding=new BasicHttpBinding();
EndpointAddress EndpointAddress=新的EndpointAddress(“http://localhost:1003/Person.svc");
IPersonService personService=新的ChannelFactory(basicHttpBinding,endpointAddress).CreateChannel();
//+
Person=personService.GetPersonData(“F488D20B-FC27-4631-9FB9-83AF616AB5A6”);

很值得一读。

显然,请确保引用DataContract程序集,并且大部分操作将从那里自动进行。顺便说一句,默认情况下,如果您在正确引用的程序集中有类型,则该复选框应处于启用状态。我有类似以下内容:[DataContract(Name=“User”)]的内容,因此我有一个名为User的WCF服务,我有[DataContract(Name=“Company”]和WCF服务公司,它们都在同一类库中,公司有一个方法ListCompany(用户,Id)-USER是真正的用户datacontract作为参数,当我调用Company WCF service时,我需要向用户传递一个参数,但我不能使用原始用户,我只能使用Company.USER。当我们创建分离的DataContracts和WCF服务时,这是默认值吗?我现在有点困惑。是否有名为
USER
的服务和名为
的类>用户
?我想您可能需要重新编辑您的问题并添加一些代码片段。
BasicHttpBinding basicHttpBinding = new BasicHttpBinding();
    EndpointAddress endpointAddress = new EndpointAddress("http://localhost:1003/Person.svc");
    IPersonService personService = new ChannelFactory<IPersonService>(basicHttpBinding, endpointAddress).CreateChannel();
    //+
    Person person = personService.GetPersonData("F488D20B-FC27-4631-9FB9-83AF616AB5A6");