无法为net tcp wcf服务添加服务引用

时间:2012-01-21 22:09:38

标签: wcf tcp nettcpbinding

我在本地计算机上托管了一个WCF服务作为Windows服务。现在我正在尝试在客户端添加服务引用(再次在我的本地开发机器上),但是我收到错误

  

元数据包含无法解析的引用:   '的net.tcp://本地主机:8523 /服务1'。无法连接到   的net.tcp://本地主机:8523 /服务1。连接尝试持续了一段时间   时间跨度00:00:02.0011145。 TCP错误代码10061:无连接   可以制作,因为目标机器主动拒绝它

我检查过Windows防火墙没有阻止端口8523.我甚至在Windows防火墙中创建了一个新规则,允许运行8523端口。但是当我正在运行netstat -sp tcp时,我似乎无法找到端口8523.但我可以看到Serice1服务的状态在服务中设置为START。这是配置文件

服务库

<system.serviceModel>
  <services>
    <service name="WcfServiceLibrary1.Service1">
      <endpoint 
           address="" 
           binding="netTcpBinding" bindingConfiguration=""
           contract="WcfServiceLibrary1.IService1">
         <identity>
           <dns value="localhost" />
         </identity>
      </endpoint>
      <endpoint 
           address="mex" 
           binding="mexTcpBinding" bindingConfiguration=""
           contract="IMetadataExchange" />
      <host>
        <baseAddresses>
          <add baseAddress="net.tcp://localhost:8523/Service1" />
        </baseAddresses>
      </host>
    </service>
  </services>
  <behaviors>
    <serviceBehaviors>
      <behavior name="">
        <serviceMetadata httpGetEnabled="false" />
        <serviceDebug includeExceptionDetailInFaults="false" />
      </behavior>
    </serviceBehaviors>
  </behaviors>
</system.serviceModel>

Windows服务项目中的配置看起来完全相同。

4 个答案:

答案 0 :(得分:4)

迈克尔,这是我通常用于WCF服务的net.tcp绑定。

    <bindings>
        <netTcpBinding>
            <binding name="TcpBinding"
                     receiveTimeout="Infinite"
                     sendTimeout="Infinite"
                     maxBufferSize="2147483647"
                     maxReceivedMessageSize="2147483647">
                <reliableSession inactivityTimeout="Infinite"/>
                <security mode="None"/>
            </binding>
        </netTcpBinding>
    </bindings>

尝试将其添加到您的配置中:

<service name="WcfServiceLibrary1.Service1">   
    <endpoint    
        address=""    
        binding="netTcpBinding" bindingConfiguration="TcpBinding"   
        contract="WcfServiceLibrary1.IService1">   
    ...

此外,我的服务正在ServiceAccount.LocalSystem下运行。

检查

  

netstat - ap tcp

如果服务正在收听。

编辑:我的服务类如下。请注意,Windows服务的当前目录以编程方式设置为BaseDirectory,即可执行文件的目录。

public class Service : ServiceBase
{
    public static void Main()
    {
        Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);
        ServiceBase.Run(new Service());
    }

    ...
}

答案 1 :(得分:1)

您已指定了某个行为,但尚未为其指定名称。为您的行为指定一个名称,并使用您服务中的behaviorConfiguration指向该行为。

<service name="WcfServiceLibrary1.Service1" behaviorConfiguration="svc1behavior">

...

<serviceBehaviors>
<behavior name="svc1behavior">
  <serviceMetadata httpGetEnabled="false" />
  <serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>

答案 2 :(得分:0)

检查Net.Tcp侦听器适配器服务是否正在运行(尽管如果它在控制台应用程序中托管服务时有效,它应该正在运行)。

要查找您的服务正在使用的端口,

  1. 打开任务管理器
  2. 选择查看 - &gt;选择列 - &gt;检查PID - &gt;行
  3. 找到您的服务流程名称,注意PID
  4. 从命令提示符运行followind命令:netstat -ano | findstr *PID*

答案 3 :(得分:0)

有同样的问题。经过大量的故障排除后,我发现我在服务项目中缺少对Web服务中的服务的引用,所以我将其添加到Web.config中:

<system.serviceModel>
  <services>
    <service name="serviceName" behaviorConfiguration="BasicServiceBehavior" >
      <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/>
      <endpoint address="" binding="basicHttpBinding" bindingConfiguration="BasicServiceBasicHttpBinding" contract="(I<nameofservice>)"/>
    </service>
  </services>
</system.serviceModel>

在此之后重建解决方案(创建接口)并重新发布。然后我终于可以从我的其他项目添加服务引用。