【问题标题】:WCF TCP Endpoints Cannot Add Service ReferenceWCF TCP 端点无法添加服务引用
【发布时间】:2013-04-04 07:35:12
【问题描述】:

我已经在业余时间与这个人斗争了几个星期,决心不求助于这个美妙的社区。但是我的精神已经崩溃了。所以...

我创建了一个 WCF 服务并尝试将它托管在控制台应用程序中,以使用 TCP 端点。

我有一个项目,其中包含合同和 svc 文件。 我有另一个项目,其中包含一个控制台应用程序,它引用了第一个提到的项目。 我的控制台应用程序的主要方法如下所示:

using (ServiceHost host = new ServiceHost(typeof(LicenceBucketWireService.LicenceBucketService)))
{
    host.Open();

    foreach (var endpt in host.Description.Endpoints)
    {
        Console.WriteLine("Enpoint address:\t{0}",endpt.Address);
        Console.WriteLine("Enpoint binding:\t{0}",endpt.Binding);
        Console.WriteLine("Enpoint contract:\t{0}\n", endpt.Contract.ContractType.Name);
    }
    Console.ReadLine();
}

到目前为止,一切都是花花公子:

当我尝试将该服务的服务引用添加到将使用该服务的第三个完全独立的应用程序时,它出错了。当我尝试添加引用时,使用 net.tcp://localhost:49189/LicenceBucketWireService/LicenceBucketService/mex 作为发现详细信息的地址,我收到错误:

URI 前缀无法识别。 元数据包含无法解析的引用:“net.tcp://localhost:49189/LicenceBucketWireService/LicenceBucketService/mex”。 元数据包含无法解析的引用:“net.tcp://localhost:49189/LicenceBucketWireService/LicenceBucketService/mex”。 如果在当前解决方案中定义了服务,请尝试构建解决方案并再次添加服务引用。

当我执行此任务时,控制台应用程序正在运行。 应用配置具有以下元素:

  <system.serviceModel>
    <services>
      <service name="LicenceBucketWireService.LicenceBucketService">
        <clear />
        <endpoint address="mex" binding="mexTcpBinding" contract="LicenceBucketWireService.ILicenceBucketService"
          listenUriMode="Explicit">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="net.pipe://localhost/licenceBucketService"
          binding="netNamedPipeBinding" bindingConfiguration="" contract="LicenceBucketWireService.ILicenceBucketService" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:49187/LicenceBucketWireService/LicenceBucketService" />
            <add baseAddress="net.tcp://localhost:49189/LicenceBucketWireService/LicenceBucketService" />
          </baseAddresses>
        </host>
      </service>
    </services>    
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
          <serviceMetadata httpGetEnabled="false" />
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

【问题讨论】:

  • 在您的服务配置文件中将 httpGetEnabled 属性更改为 true。

标签: wcf


【解决方案1】:

配置文件中的以下代码行:

<endpoint address="mex" binding="mexTcpBinding" contract="LicenceBucketWireService.ILicenceBucketService"
          listenUriMode="Explicit">

应该将合同作为“IMetadataExchange”而不是 LicenceBucketWireService.ILicenceBucketService。

这应该可以解决问题。

【讨论】:

  • 非常感谢。我是如此接近!
猜你喜欢
  • 2012-02-15
  • 2014-05-08
  • 2011-12-23
  • 1970-01-01
  • 2016-11-21
  • 2019-09-20
  • 2020-08-20
  • 2014-04-04
  • 1970-01-01
相关资源
最近更新 更多