WCF Windows服务。可以在本地连接,但不能远程连接

时间:2010-08-14 02:34:44

标签: c# wcf wcf-client

我花了两天时间试图解决这个问题而且我很难过。我有一个在Windows上作为服务运行的WCF服务器。客户端可以在同一台机器上连接到它,但是一旦我移动就尝试连接到另一台机器上的服务我不能。

因此,如果客户端和主机位于同一台机器上,则没有问题。如果主机和客户端位于不同的计算机上,则会出现异常错误。

这是奇怪的部分,我可以使用svcutil从远程机器生成app config和proxy.cs文件,但是一旦我调用该函数就会发出错误。

无法连接到net.tcp:// ipaddress:port / Service1。 TCP错误代码10061.无法建立连接,因为目标计算机主动拒绝它。

如果我从同一台机器主机/客户端调用它没有错误。

有什么想法吗?

更新:

以下是服务端点设置。

<system.serviceModel>
    <services>
        <service behaviorConfiguration="Service1Behavior" name="WcfServiceLibrary1.Service1">
            <endpoint address="net.tcp://192.168.1.75:8523/Service1" binding="netTcpBinding"
                contract="WcfServiceLibrary1.IService1" />
            <endpoint address="net.tcp://192.168.1.75:8523/mex" binding="mexTcpBinding"
                contract="IMetadataExchange" />
            <host>
                <baseAddresses>
                    <add baseAddress="net.tcp://192.168.1.75:8523/" />
                </baseAddresses>
            </host>
        </service>
    </services>
    <bindings>
        <netTcpBinding>
            <binding name = "TcpBindingConfiguration">
                <security mode="None"/>
            </binding>
        </netTcpBinding>
    </bindings>
    <behaviors>
        <serviceBehaviors>
            <behavior name="Service1Behavior">
                <serviceMetadata />
            </behavior>
        </serviceBehaviors>
    </behaviors>
</system.serviceModel>

我已经尝试了一切。

有什么想法吗?

再一次是客户端和主机在同一台机器上一切都很好,只要我把客户端放在另一台计算机上,没有骰子......

我从来没有在网络编程中遇到过这么多头疼......

由于

4 个答案:

答案 0 :(得分:3)

如果在主机上启用了Windows防火墙,请尝试禁用它(您可以通过控制面板访问)。如果它有效,那么你就找到了罪魁祸首。您需要在防火墙配置中为您的服务添加例外并重新启用它。

如果您使用的是任何其他第三方防火墙软件,则通常与防病毒软件捆绑在一起。

编辑:

要在TCP上设置无安全性,可以在代码中使用构造函数:

var binding = new NetTcpBinding(SecurityMode.None);

或者您可以在配置XML中执行此操作:

<netTcpBinding>
    <binding name="myTcpBinding">
        <security mode="None" />
…

答案 1 :(得分:1)

我遇到了同样的问题“......如果客户端和主机在同一台机器上,一切正常,但如果主机和客户端在不同的机器上,我会收到异常错误”。

这就解决了我的问题: 我的互联网连接设置使用了代理服务器。我将局域网设置的IE选项更改为Bypass proxy server for local addressesDo not use proxy server for addresses beginning with: http:\\host-ip-here

答案 2 :(得分:0)

WCF服务是否主动侦听该端口?您应该可以通过cmd行运行来判断:

netstat -a -n -p TCP

它应该显示进程正在侦听192.168.1.75:8523

如果是,那么您是否尝试过启用WCF跟踪日志记录?要启用它,您可以在app.config中添加类似的内容:

<system.diagnostics>
    <sources>
        <source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true">
            <listeners>
                <add name="traceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData= "C:\MyApp.svclog" />
            </listeners>
        </source>
    </sources>
</system.diagnostics>

然后尝试连接并查看是否创建了“C:\ MyApp.svclog”,以及是否显示任何错误。如果您在给定的计算机上安装了VisualStudio,则只需双击即可打开“.svclog”文件。


编辑:抱歉,我在上述评论中错过了您已启用跟踪日志记录的信息。 至少你知道WCF正在接收即将到来的消息。我以前从未见过您的特定错误,抱歉。

答案 3 :(得分:0)

在服务器端,我做了这个并且它可以工作:

var tcpServiceUri = new UriBuilder
            {
                Scheme = Uri.UriSchemeNetTcp,
                Host = LocalIPAddress(),//@"127.0.0.1", //IpAddress,
                Port = int.Parse(_port), //BaseTcpPort,
                Path = @"/SomeService",
            };
_host = new ServiceHost(typeof(SomeService), tcpServiceUri.Uri);

public string LocalIPAddress()
{
    IPHostEntry host;
    string localIP = "";
    host = Dns.GetHostEntry(Dns.GetHostName());
    foreach (IPAddress ip in host.AddressList)
    {
        if (ip.AddressFamily == AddressFamily.InterNetwork)
        {
            localIP = ip.ToString();
            break;
        }
    }
    return localIP;
 }