我一直在关注Miguel Castro关于WCF here的精彩文章,除了我有以下代码之外,它都很好用,
public AdminClient()
{
ChannelFactory<IProductAdmin> factory = new ChannelFactory<IProductAdmin>();
productAdminChannel = factory.CreateChannel();
}
在我的app.config文件中,我有以下配置:
<system.serviceModel>
<client>
<endpoint address="net.tcp://localhost:8002/ProductBrowser"
binding="netTcpBinding"
contract="Contracts.IProductAdmin" />
</client>
</system.serviceModel>
但是,当我运行AdminClient的构造函数时,我得到一个异常,说明没有定义端点。但是,如果我更改配置以给端点命名,然后按如下方式创建工厂,则它可以工作。
public AdminClient()
{
var fac = new ChannelFactory<IProductAdmin>("admin");
productAdminChannel = fac.CreateChannel();
}
<system.serviceModel>
<client>
<endpoint name="admin"
address="net.tcp://localhost:8002/ProductBrowser"
binding="netTcpBinding"
contract="Contracts.IProductAdmin" />
</client>
</system.serviceModel>
我喜欢这个的解释。 MSDN中的文档帮助不大......
答案 0 :(得分:61)
使用“*”来使用第一个合格终点。
public AdminClient()
{
ChannelFactory<IProductAdmin> factory
= new ChannelFactory<IProductAdmin>("*");
productAdminChannel = factory.CreateChannel();
}
答案 1 :(得分:3)
您需要指定端点名称,因为您可以为同一类型的合同设置许多端点。 (例如,在一个tcp和一个http ws端点上部署的服务)。当然,微软可以在WCF中构建一些内容来检查是否只有一个客户端为合同接口指定,但这不会非常一致。 (如果只为合同指定了一个端点,它将起作用)。当您稍后为同一合同添加另一个端点时,代码将在这种情况下中断。
答案 2 :(得分:2)
这一直困扰着我几天,所以我浏览了上面链接的文章中显示的示例。一切正常,除了您遇到问题的第二个客户端代理示例。正如您所指出的那样,以这种方式创建代理的其他回答者需要一个端点名称,将其与客户端(定义端点的位置)耦合。我仍然不确定它为什么会这样做,但我没有办法在没有明确地将代理耦合到端点的情况下使用该示例。
另一方面,显示如何创建代理的第一个示例不需要明确耦合端点地址或绑定:
using System;
using System.ServiceModel;
namespace CoDeMagazine.ServiceArticle
{
public class ProductClient
: ClientBase<IProductBrowser>,
IProductBrowser
{
#region IProductBrowser Members
public ProductData GetProduct(
Guid productID)
{
return Channel.GetProduct(productID);
}
public ProductData[] GetAllProducts()
{
return Channel.GetAllProducts();
}
public ProductData[] FindProducts(
string productNameWildcard)
{
return Channel.FindProducts(
productNameWildcard);
}
#endregion
}
}
这似乎工作得很好。所以,也许第二个代理示例只是一种糟糕的做事方式,或者我们可能遗漏了一些明显的东西......
答案 3 :(得分:1)
您可以在服务端未指定端点名称的情况下离开。 对于客户端,您需要指定名称,因为您可能正在连接到具有相同合同的多个服务。 WCF如何知道你想要哪一个?
答案 4 :(得分:1)
如果您不想指定端点名称明确,可以写:
public AdminClient()
{
ChannelFactory<IProductAdmin> factory =
new ChannelFactory<IProductAdmin>(string.Empty);
productAdminChannel = factory.CreateChannel();
}
不必要的无参数构造函数不起作用。