WCF TCP端点无法添加服务引用。

3
我已经在闲暇时间里努力解决这个问题几周了,坚决不想向这个非常棒的社区求助。但是我的精神已经崩溃了。所以...
我创建了一个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();
}

到目前为止,一切都很好: enter image description here 当我试图为一个完全独立的第三方应用程序添加服务引用以使用该服务时,情况就变得不妙了。当我尝试添加引用并使用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。 - tom redfern
1个回答

5
在配置文件中,以下一行代码为例:
<endpoint address="mex" binding="mexTcpBinding" contract="LicenceBucketWireService.ILicenceBucketService"
          listenUriMode="Explicit">

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

这样就可以解决问题了。


非常感谢。我已经接近成功了! - onefootswill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接