我花了两天时间试图解决这个问题而且我很难过。我有一个在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>
我已经尝试了一切。
有什么想法吗?
再一次是客户端和主机在同一台机器上一切都很好,只要我把客户端放在另一台计算机上,没有骰子......
我从来没有在网络编程中遇到过这么多头疼......
由于
答案 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 addresses
和Do 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”文件。
答案 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;
}