16

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

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

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

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

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

4

2 回答 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);

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

于 2011-02-24T05:55:13.800 回答
9

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

例如,如果您想使用 BasicHttpBinding:

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

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

于 2011-02-23T23:43:21.290 回答