Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF,替换';本地主机';使用我的IP还是应该使用NetTcpBinding?_C#_Wcf - Fatal编程技术网

C# WCF,替换';本地主机';使用我的IP还是应该使用NetTcpBinding?

C# WCF,替换';本地主机';使用我的IP还是应该使用NetTcpBinding?,c#,wcf,C#,Wcf,在继续学习WCF的同时,我已经完成了入门教程,并创建了我的第一个服务器/客户端应用程序。:) 但现在我想知道,如果我想让这个应用程序在不同的机器上运行,我应该怎么做 从服务器应用程序: Uri baseAddress = new Uri("http://localhost:8000/Server"); ServiceHost selfHost = new ServiceHost(typeof(CalculatorService), baseAddress); 如果我想从外部获得此服务,我应该用

在继续学习WCF的同时,我已经完成了入门教程,并创建了我的第一个服务器/客户端应用程序。:)

但现在我想知道,如果我想让这个应用程序在不同的机器上运行,我应该怎么做

从服务器应用程序:

Uri baseAddress = new Uri("http://localhost:8000/Server");
ServiceHost selfHost = new ServiceHost(typeof(CalculatorService), baseAddress);
如果我想从外部获得此服务,我应该用什么替换“localhost”? 我试着用我的IP替换它,但没用

有什么想法吗

我还听说HttpBinding有点过时,主要用于wcf应用程序需要与非wcf应用程序通信时。在wcf到wcf的通信中,应该使用NetTcpBinding,是这样吗


谢谢!:)

如果您希望外部世界可以访问它,可以将其替换为面向公众的IP

将为您提供公共IP

如果您只想在网络上使用它,则可以将其替换为家庭网络上计算机的IP或主机名。通常以192.168.x.x开头

请记住在主机上安装。此外,如果您在internet上有一台计算机试图连接到您的公共IP,则您必须学习如何在路由器中将请求发送到本地网络上的相应计算机

编辑 为了更好地帮助您了解网络结构的工作方式,您需要了解您的公共IP(whatismyip.com上的IP)是ISP分配给路由器的IP(假设您在路由器后面)。然后,路由器为网络上的计算机分配自己的本地IP,通常从192.168.x.x开始。如果客户端应用程序试图连接到公共IP,路由器需要知道如何处理该请求。它必须有一条规则,规定该端口上的请求需要转发到网络上的特定计算机(运行主机应用程序的计算机)

如果你不在路由器后面,那么你需要担心的就是你的防火墙

编辑2 您是网络新手,所以您必须了解,对于在路由器后面的服务器上侦听的应用程序,您无法绕过端口转发。研究下图:


(来源:)

这是家庭网络的常见结构。现在用IP地址研究这个图

这些都是由IP组成的,但你明白了。您的路由器由Internet服务提供商分配IP。然后,路由器为网络上的计算机分配自己的IP。当一个请求进入你的公共IP时,它会击中你的路由器。您的路由器接收来自客户端应用程序的请求,但不执行任何操作,因为它没有任何软件等待请求。这就是为什么他们称路由器为硬件防火墙,来自internet的请求无法到达您网络上可能存在漏洞的PC

让请求找到正确的PC的唯一方法是告诉路由器怎么做。大多数路由器都有一个配置接口,带有端口转发部分,供您执行此操作。例如,linksys路由器配置页面:


(来源:)

Ext Port是路由器应该侦听传入请求的端口。您可以指定一系列端口,或者通常只指定一个端口

协议是要侦听的请求类型。如果您不知道UDP和TCP之间的区别,那么您必须研究这一点,因为它超出了本答案的范围。我相信如果你正在阅读一本好的WCF教科书,那么你很快就会了解这些协议。现在请记住,您的大多数初始连接都是TCP。如果你两个都向前,也不会有什么坏处

IP地址是路由器应将请求转发到的计算机的本地IP。请注意,在这个linksys屏幕截图中,它已经填充了前3个部分。这是因为它已经知道网络本地IP地址的第一部分,因为它首先分配了它们

然后只需选中启用转发规则的复选框。您的路由器现在将通过您指定的端口或端口范围从外部世界向网络上相应的PC发送连接。不同品牌的路由器有不同的配置页面,但它们应该非常相似和直接

让同时拥有客户端和服务器应用程序并希望设置它的用户必须转发端口是一个巨大的麻烦。这就是为什么大多数应用程序都有一个中央服务器,并且只向用户分发客户端应用程序

注意:请记住,只有正在侦听请求的主机应用程序需要将端口转发给它(如果它位于路由器后面)。客户端应用程序不会知道这两者之间的区别,您只需要加入一个面向公众的IP

  • 第一种选择是在某处设置一个中央托管应用程序。因此,基本上,您可以在服务器上设置一个托管应用程序,并按照您需要的方式设置所有网络配置(端口转发)。然后,所有客户端应用程序都连接到该服务器,服务器在它们之间来回传递信息


  • (来源:)

    HttpBinding主要用于asmx兼容性等(我认为它已被WSHttpBinding取代)。绑定取决于不同绑定的使用外观


    此外,你不应该改变任何事情。要从外部调用它,请像@Chevex指定的那样使用ip替换localhost,但要确保防火墙已关闭/端口未被阻止。

    至于应该使用哪种绑定,这取决于服务的公开方式以及需要哪些功能。Http很好,因为它很容易通过通常在防火墙中打开的端口公开(80443)。NetTcp应该更快,但它实际上取决于应用程序

    关于您应该将localhost更改为什么,我要提到的第一件事是baseAddress参数不是必需的。因此,您可以更新您的服务
    ServiceHost selfHost = new ServiceHost(typeof(CalculatorService));