在客户端应用程序中,在代码中创建 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();
这要求配置文件在您的服务合同中包含 <client>
条目 - 如果没有,您将收到您遇到的错误。
但是由 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 终结点配置?的主要内容,如果未能解决你的问题,请参考以下文章