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

7
我花了两天时间试图解决这个问题,但是我束手无策。我有一个运行在Windows上的WCF服务器。客户端可以在同一台机器上连接到它,但是当我尝试从另一台机器连接到服务时,就会出现异常错误。
如果客户端和主机在同一台机器上,就没有问题。如果主机和客户端在不同的机器上,我就会遇到异常错误。
奇怪的是,我可以使用svcutil从远程机器生成app配置和proxy.cs文件,但是一旦我调用函数,它就会抛出错误。
无法连接到net.tcp://ipaddress:port/Service1。TCP错误代码10061。无法建立连接,因为目标计算机积极拒绝了它。
如果我从相同的机器Host / Client调用它,就不会出现错误。
有什么想法吗?
更新:
这是服务端点设置。
<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>

我已经尝试了所有方法。

有什么想法吗?

如果客户端和主机在同一台机器上,一切都很好,但是一旦我将客户端放在另一台计算机上,就不行了...

我以前从未在网络编程方面遇到过这么多问题...

谢谢。


还有一件事,有时我会遇到这个错误:套接字连接被中止。这只会在远程机器尝试与主机通信时发生。如果客户端在主机上,就没有问题...令人沮丧... - nitefrog
我感觉到防火墙的存在;你能否尝试从远程电脑通过telnet连接你的托管服务?检查两台电脑的防火墙。顺便问一下,你连接的是哪个端口? - KMån
1
请提供您服务端点配置的示例。此外,客户端和服务器操作系统是什么,它们是否在同一个域中。服务正在以哪个用户身份运行,客户端正在以哪个用户身份运行。 - Franci Penov
请看这个问题。问题可能是无法访问 Temp 文件夹。https://dev59.com/4lHTa4cB1Zd3GeqPT7MJ - Rohit Vipin Mathews
4个回答

3
如果主机上启用了Windows防火墙,请尝试禁用它(可以通过控制面板进入)。如果这样可以解决问题,那么你已经找到了罪魁祸首。您需要在防火墙配置中添加服务的例外并重新启用它。
如果您使用任何其他第三方防火墙软件,同样适用,通常与防病毒软件捆绑在一起。
编辑:要在TCP上设置无安全性,可以在代码中使用构造函数。
var binding = new NetTcpBinding(SecurityMode.None);

或者您可以在配置XML中完成此操作:
<netTcpBinding>
    <binding name="myTcpBinding">
        <security mode="None" />

没有防火墙。主机计算机和客户端都已禁用。一切都是完全开放的,这让我感到困惑... - nitefrog
我打开了跟踪功能并得到了以下错误信息:在身份验证期间未满足安全要求。所需:签名,已协商:加密和签名。如何关闭安全性???求助... - nitefrog
@nitefrog -- 添加了有关在 NetTcpBinding 上禁用安全性的信息。 - Jay
“我怎么能关闭安全呢?”这种说法在这里会触动很多警报。 - ErikHeemskerk
@Erik:我建议将其禁用作为故障排除技术。 - John Saunders
显示剩余3条评论

1

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

这是解决我的问题的方法: 我的互联网连接设置使用了代理服务器。我更改了IE选项中的LAN设置,以便“绕过本地地址的代理服务器”和“不要使用代理服务器,对于以http:\\host-ip-here开头的地址”。


0

WCF服务是否在该端口上主动监听?您可以通过从命令行运行以下命令来确定:

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 正在接收即将到来的消息。不过我以前从未见过您遇到的这种错误,很抱歉。


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;
 }

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