我有一堆远程机器都通过HTTP运行相同的WCF服务。我有一个中央配置实用程序,需要在运行时决定连接哪些。我不想在配置文件中定义所有端点,因为这是所有数据库驱动的。
我天真地尝试过这个:
CustomerServiceClient GetClientForIPAddress(string ipAddress)
{
string address = String.Format("http://{0}/customerservice.svc", ipAddress);
var client = new CustomerServiceClient("?", address);
return client;
}
其中CustomerServiceClient是我的服务引用代理类,但(不出所料)它给了我以下错误:
找不到端点元素 名称 '?'和合同 'SkyWalkerCustomerService.ICustomerService' 在ServiceModel客户端中 配置部分。这可能是 因为没有配置文件 找到您的申请,或因为 没有匹配此名称的端点元素 可以在客户端元素中找到。
那么如何在运行时声明端点并将服务引用指向它呢?
.NET 3.5
答案 0 :(得分:3)
这是我用来在silverlight应用中配置我的端点的一段代码:
private void initEndpoint(ServiceEndpoint endPoint, string serviceName)
{
Uri hostUri = Application.Current.Host.Source;
string vdir = hostUri.LocalPath.Substring(0, hostUri.LocalPath.IndexOf("/ClientBin", StringComparison.InvariantCultureIgnoreCase));
string wcfBaseUri = string.Format("{0}://{1}:{2}{3}/WebServices/", hostUri.Scheme, hostUri.Host, hostUri.Port, vdir);
endPoint.Address = new EndpointAddress(new Uri(wcfBaseUri + serviceName));
}
传入的 endPoint 是要配置的端点, serviceName 是服务的名称,如 MyLoggingService.svc 。我只是将它指向一个新地址(在这种情况下是托管网站内的已知位置)。使用此作为示例,只需从其中传递您自己的字符串地址。
使用一些看起来像这样的代码来调用它:
_loggingService = new LoggingServiceClient();
initEndpoint(_loggingService.Endpoint, "LoggingService.svc");
希望这会有所帮助。拿起它并随之运行,将其切碎并使其成为您自己的:)