为什么我的ChannelFactory没有看到我的端点配置?

时间:2009-01-08 21:29:40

标签: wcf

我一直在关注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中的文档帮助不大......

5 个答案:

答案 0 :(得分:61)

使用“*”来使用第一个合格终点。

public AdminClient()
{
    ChannelFactory<IProductAdmin> factory  
         = new ChannelFactory<IProductAdmin>("*");

    productAdminChannel = factory.CreateChannel();
}

MSDN Example

答案 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();
    }

不必要的无参数构造函数不起作用。