WCF,用我的IP替换'localhost'还是应该使用NetTcpBinding?

时间:2011-04-07 17:15:34

标签: c# wcf

继续学习WCF我从http://msdn.microsoft.com/en-us/library/ms734712.aspx完成了入门教程并创建了我的第一个服务器/客户端应用程序。 :)

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

来自服务器应用:

Uri baseAddress = new Uri("http://localhost:8000/Server");
ServiceHost selfHost = new ServiceHost(typeof(CalculatorService), baseAddress);

如果我希望从外面获得此服务,我该如何更换“localhost”? 我尝试用我的IP替换它,但那不起作用。

有什么想法吗?

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

谢谢! :)

3 个答案:

答案 0 :(得分:8)

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

WhatIsMyIp.com将为您提供公共IP。

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

请记住主机上的open ports in your firewall。此外,如果您的互联网上的计算机试图连接到您的公共IP,您将必须学习如何在路由器中执行port forwarding以将请求发送到本地网络上的相应计算机。

修改

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

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

编辑2

您不熟悉网络,因此您必须了解的是,您无法绕过在路由器后面的服务器上侦听的应用程序的端口转发。研究下图:

http://clear-cloud.com/sitebuildercontent/sitebuilderpictures/router-diagram.gif

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

http://www.codetunnel.com/networkdiagram.jpg

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

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

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

协议是要侦听的请求类型。如果您不知道UDP和TCP之间的区别,那么您需要研究它,因为它超出了本答案的范围。我敢肯定,如果您正在阅读一本好的WCF教科书,那么您很快就会了解这些协议。现在请记住,大多数开始的连接都是TCP。如果你转发它们也不会受伤。

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

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

让拥有客户端和服务器应用程序且想要设置它的用户必须转发端口是一个巨大的痛苦。这就是为什么大多数应用程序都有一个中央服务器并且只将客户端应用程序传递给用户的原因。

注意:请记住,只有正在侦听请求的主机应用程序需要将端口转发到它,如果它位于路由器后面。客户端应用程序不会知道其中的区别,您只需要公开面向IP。

  1. 第一个选项是在某处设置中央托管应用程序。所以基本上,你在服务器上设置了一个托管应用程序,所有网络配置(端口转发)都按照你需要的方式设置。然后,所有客户端应用程序都连接到该服务器,服务器在它们之间来回传递信息。
  2. http://homepages.uel.ac.uk/u0219091/jw-1019-jxta1-client%20server%20model.gif

答案 1 :(得分:0)

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

此外,您不必更改任何内容。从外部调用它会像你一样用你的ip替换localhost(由@Chevex指定),但要确保防火墙已关闭/端口已被解锁。

答案 2 :(得分:0)

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

关于你应该将localhost更改为什么,我要提到的第一件事是不需要baseAddress参数。因此,您只需使用Type:

即可新建服务主机
ServiceHost selfHost = new ServiceHost(typeof(CalculatorService));

您的服务配置应位于ServiceModel元素

中的配置文件中