在另一个项目 c# 中使用引用项目的 WCF 服务

Posted

技术标签:

【中文标题】在另一个项目 c# 中使用引用项目的 WCF 服务【英文标题】:using a referenced project's WCF service in another project c# 【发布时间】:2015-12-07 03:52:24 【问题描述】:

当涉及到 WCF 和普通引用时,我很难理解某些引用方面。我有一个包含 4 个项目的解决方案。一个项目是服务,另外三个具有对该项目的服务引用。一个项目是传统上在其他三个项目中引用的基类库。

我必须按特定顺序更新服务引用,否则 VS 会对不明确的引用感到困惑。这是由于 WCF 引用以某种方式通过普通引用导入,因此所有与服务相关的内容都有两个命名空间。

我试图通过从除基本库之外的所有服务引用中删除服务引用来整理这一点,因此这将成为 WCF 连接的仲裁者并且不再有歧义。但是我不确定是否可以通过引用的方式在另一个项目中使用服务引用,并且服务会抛出未找到端点的异常。我确保这些项目仍然有终点,但他们现在没有参考。我假设端点会通过基本参考来实现,但似乎不是。现在基础库中的类在它们的基础版本和服务版本之间也存在冲突。

基本上,参考文献是这样的:

WCFProject ->serviceReferencereference

如何让 SiteProjects 在没有主项目中的服务引用但 BaseLibrary 中的服务引用的情况下使用 WCF 服务?

【问题讨论】:

我应该补充一点,我在调用引用时添加了 BaseLibrary 命名空间,例如:using(BaseNameSpace.WCFName.ServiceClient etc) 如果您认为这可以解决您的问题,则可以在您添加引用的程序集内部创建服务引用。 我不确定@Biscuits 我会检查这是否会有所帮助,但是我认为我的问题是我正在尝试让一个项目从引用的项目继承服务引用,但我不认为那是一回事。 您说的是“服务项目”,然后是“基类库项目”和“家庭项目”,并继续提到 3,这可能与引用“基类”的项目相同,也可能不同图书馆项目”,也有服务参考。我发现很难理解这一点。哪个是哪个?能给我们两张清晰的图片吗?一个显示程序集引用,另一个显示服务引用 - 但清楚地标识相同的项目 @Biscuits 很抱歉不清楚。该解决方案有 4 个项目,只有一个是服务项目,只有一个是引用项目,它们是独立的,其余两个是 Web 表单站点,它们都使用基础库中的服务和类。 【参考方案1】:

对于那些偶然发现这一点的人,我找到了一种使用以下 SO 线程来使用引用项目服务引用的方法:Could not find default endpoint element

【讨论】:

【参考方案2】:

我认为您应该从问“为什么这些引用服务引用而不是二进制引用?”开始。

这很可能是有充分理由的,例如,服务将部署到解决方案中其他项目的单独机器上。另一个原因是服务提供的功能不适合在进程内运行,并且会使消费应用程序过于复杂。

在您的场景中,问题是:

“对于三个服务消费者中的每一个,我是否可以通过简单地通过二进制引用引用服务内部来利用服务的功能?”

如果答案是肯定的,那么通过一些重构,您可以简单地删除 WCF 服务库代码和服务引用。然后,您将拥有三个项目,它们都在运行时托管所需的功能。

这是可取的,有几个原因,但这里有两个:

    进程内代码比进程外代码(如 wcf 服务)快几个数量级。 进程内代码更易于管理和部署。

但是,如果您确实需要将服务的功能保持在 WCF 服务中,那么您仍然可以通过以下方式显着简化您的解决方案:

    将服务转移到自己的解决方案中,并且 去掉所有的服务引用,改用ChannelFactory<T>.CreateChannel()直接调用服务。

ChannelFactory 允许您通过直接引用服务二进制文件来调用服务。这消除了对服务引用的需求,它没有共享的二进制依赖项。

这种方法是可取的,原因有很多,但这里有两个:

    无需服务引用,大大简化了您的代码。 当服务发生变化时,不需要更新任何东西;更改可通过二进制引用获得,并且与在进程中使用程序集一样自然。

我经常看到将 WCf 服务作为项目包含在解决方案中的示例,其中解决方案中的其他项目通过服务引用使用服务。在我看来,这不是好的设计。首先,服务应该从不与其消费者一起驻留在单一解决方案中,其次,消费者应该直接使用服务而不使用服务引用,除非绝对必要。

我不熟悉不使用参考的过程和您的 解决方案看起来很有趣。我会仔细阅读的

请做。在您完全控制服务和消费者的情况下,服务引用没有位置。我知道这听起来很规范,但经验丰富。

数据库模型库位于 BaseLibrary 中,它们是 在服务项目中作为参考使用

哪些项目引用了这个程序集?如果服务使用它,那么您可以使用该服务将其移出解决方案。但是客户也使用这个吗?如果是这样,这是否意味着客户端和服务都访问同一个数据库?如果不是,那么为什么它们都使用相同的数据模型?

将服务转移到另一个解决方案不会否定 项目间代码只有一个地方?

我强烈反对将项目间代码放在一个地方总是将​​项目组合在一个解决方案中的一个很好的理由。然后,您可以将彼此完全不相关的项目(从业务、技术或能力的角度)共享一个解决方案,这样他们就可以从这个“优势”中受益。我认为更好的策略是将通用程序集删除到它自己的解决方案中,然后将其发布到本地 NuGet 服务器。任何需要此程序集的项目都可以从 NuGet 中检索它。

【讨论】:

服务将部署在不同的机器上,因此需要引用。我不熟悉不使用参考的过程,您的解决方案看起来很有趣。我会阅读的。数据库模型库驻留在 BaseLibrary 中,这些在服务项目中以引用的方式使用。将服务转移到另一个解决方案不会否定只有一个地方用于项目间代码的优势吗? @Tom Redfern @MoustacheDangerous - 请根据您的评论更新我的答案。 非常感谢您@Tom Redfern 的详细说明。在这种情况下,我认为我没有时间将服务移出解决方案,但我认为我已经意识到你所说的其他问题。我做了一些糟糕的设计决定,现在正在付出代价。感谢您的详细解答。

以上是关于在另一个项目 c# 中使用引用项目的 WCF 服务的主要内容,如果未能解决你的问题,请参考以下文章

Qt - 引用项目的 main() 函数覆盖实际项目的 main()

在一个多模块的python项目中,如何在子模块中引用项目的根目录?

在单元测试期间获取引用项目的路径

来自引用项目的 ASP.NET 自定义配置部分不起作用?

我在.net中添加了一个引用,怎么把这个引用删除、我只是在项目中找到了添加引用项。但是怎么删除呢

Visual Studio 2005,如何获得解决方案中使用项目的位置?