在客户端应用程序中,在代码中创建 WCF 终结点配置?

Posted

技术标签:

【中文标题】在客户端应用程序中,在代码中创建 WCF 终结点配置?【英文标题】:Create WCF endpoint configurations in the client app, in code? 【发布时间】:2011-07-03 04:33:55 【问题描述】:

我正在尝试从 .NET 客户端应用程序使用 WCF Web 服务,并且我认为我需要能够以编程方式创建端点,但我不知道如何。我认为我需要这样做,因为当我尝试运行应用程序时,我收到以下错误:

找不到默认端点 引用合约的元素 ServiceModel 中的“IEmailService” 客户端配置部分。这 可能是因为没有配置文件 为您的应用程序找到了,或 因为没有端点元素匹配 这份合同可以在 客户端元素。

在解决此错误时,我创建了一个简单的 Windows 窗体应用程序,我尝试在其中使用相同的 Web 服务。使用此测试应用程序,我可以成功连接到 Web 服务,并且得到有效响应。但是,我可以通过从应用程序的 app.config 文件中删除 system.serviceModel 节点及其所有子节点,在我的测试应用程序中重现上面引用的确切错误(我可能不必删除所有该部分,我不确定)。所以,我的第一个想法是,我需要将该部分添加到真正的应用程序的 app.config 文件中,一切都应该没问题。不幸的是,出于荒谬的原因,我不会在这里讨论,这不是一个选择。因此,我不得不在客户端应用程序内部的代码中生成这些信息。

我希望这里有人可以帮助我解决这个问题,或者可以为我指出解决此类问题的好资源。

是否可以在客户端应用程序中以代码创建端点配置?

【问题讨论】:

【参考方案1】:

如果您有对定义接口的程序集的引用,则使用 WCF 服务的一种东方方式是使用 System.ServiceModel.ChannelFactory 类。

例如,如果您想使用 BasicHttpBinding:

var emailService = ChannelFactory<IEmailService>.CreateChannel(new BasicHttpBinding(), new EndpointAddress(new Uri("http://some-uri-here.com/));

如果您没有对服务程序集的引用,则可以使用生成的代理类上的重载构造函数之一来指定绑定设置。

【讨论】:

谢谢你,eulerfx。我对这一切都很陌生,所以我不确定如何在变量包含数据后使用它,但我会探索这个角度,看看它会把我带到哪里。 非常感谢!我能够使用您的建议以及位于以下地址的资源来解决这个问题:msdn.microsoft.com/en-us/library/ms734681.aspx Arg ... 事实证明,虽然这确实允许我的测试应用程序在 app.config 中没有 system.serviceModel 部分的情况下正常工作,但由于某种原因,我仍然遇到同样的错误从实际应用中。我会继续研究。 @eulerfx,这是一个很好的建议!无需通过这种方式创建代理类或添加服务引用!!【参考方案2】:

默认情况下,当您执行Add Service Reference 操作时,WCF 运行时将为您生成客户端代理。

使用它的最简单方法是使用不带参数的构造函数实例化客户端代理,然后从app.config 获取信息:

YourServiceClient proxy = new YourServiceClient();

这要求配置文件在您的服务合同中包含 &lt;client&gt; 条目 - 如果没有,您将收到您遇到的错误。

但是由 WCF 运行时生成的客户端代理类也有额外的构造函数 - 例如一个接受端点地址和绑定:

BasicHttpBinding binding = new BasicHttpBinding(SecurityMode.None);
EndpointAddress epa = new EndpointAddress("http://localhost:8282/basic");

YourServiceClient proxy = new YourServiceClient(binding, epa);

使用此设置,根本不需要配置文件 - 您可以在代码中定义所有内容。当然,您也可以在代码中设置绑定和/或端点的任何其他属性。

【讨论】:

这正是我所需要的。我无法告诉你我对此有多感激! 什么是“YourServiceClient 代理 = new YourServiceClient();” ?是界面吗?它是端点的名称还是客户端的名称?在 app.config XAML 中,它不允许我将名称添加到 标记。

以上是关于在客户端应用程序中,在代码中创建 WCF 终结点配置?的主要内容,如果未能解决你的问题,请参考以下文章

如何在代码而不是配置中创建 WCF EndPointBehaviors?

WCF 客户端创建问题

WCF学习之旅—WCF服务配置(十四)

JDE WCF 服务

在 Azure 托管的 WCF 中找不到终结点

保存在 WCF 服务中创建的列表,以便在服务重新启动时查看它