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

16

我正在尝试从.NET客户端应用程序中调用WCF web服务,我认为我需要能够通过编程方式创建端点,但我不知道该如何操作。我认为我需要这样做是因为当我尝试运行应用程序时,出现了以下错误:

在 ServiceModel 客户端配置节中找不到引用协定“ IEmailService”的默认端点元素。这可能是由于未找到你的应用程序的配置文件或客户端元素中没有与此协定匹配的端点元素所致。

在排除故障时,我创建了一个简单的Windows窗体应用程序,在其中尝试访问同一Web服务。使用此测试应用程序,我可以成功连接到Web服务,并获得有效响应。但是,如果从应用程序的app.config文件中删除system.serviceModel节点及其所有子节点(我可能不必删除该部分的所有内容,我不确定),则可以在我的测试应用程序中重现上述确切错误。因此,我的第一个想法是,我需要将该部分添加到真实应用程序的app.config文件中,然后一切都应该没问题。不幸的是,由于一些荒谬的原因(我这里不想深入讨论),这不是一个选项。因此,我只能在客户端应用程序内部以代码形式生成此信息。

我希望这里有人能帮助我解决这个问题,或者指向一个解决此类问题的好资源。

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

2个回答

41

默认情况下,执行 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);

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


4
这正是我需要的。我无法告诉你我有多么感激! - campbelt
"YourServiceClient proxy = new YourServiceClient();" 是什么?它是接口吗?它是端点的名称还是客户端的名称?在 app.config XAML 中,它不允许我向 <client> 标记添加名称。 - Maverick Meerkat

9
如果您拥有定义接口的程序集引用,使用System.ServiceModel.ChannelFactory类是使用WCF服务的一种简单方式。例如,如果想要使用BasicHttpBinding:
var emailService = ChannelFactory<IEmailService>.CreateChannel(new BasicHttpBinding(), new EndpointAddress(new Uri("http://some-uri-here.com/));

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

谢谢您,eulerfx。我对这一切都很新,所以我不确定变量一旦包含数据后该如何使用,但我会探索这个方向,看看它会带我去哪里。 - campbelt
非常感谢!我能够使用您的建议,以及位于以下地址的资源来解决这个问题:http://msdn.microsoft.com/en-us/library/ms734681.aspx - campbelt
翻译:糟糕...事实证明,虽然这样做可以让我的测试应用程序在没有system.serviceModel部分的app.config的情况下正常工作,但由于某种原因,我仍然从真实应用程序中收到相同的错误。我将继续研究。 - campbelt
@eulerfx,这是一个很好的建议!这样就不需要创建代理类或添加服务引用了!! - zaitsman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接