最近解决公司一个老平台的问题,该平台中使用了 Remoting 技术,现有的环境大致如下:
1、Remoting 服务和 Web 都是部署在局域网;
2、多台 Web 都是通过内网 IP 和端口来访问 Remoting 。
Remoting 服务端的代码如
int serverPort = 10000;
TcpServerChannel Channel = new TcpServerChannel(serverPort);
ChannelServices.RegisterChannel(Channel, false);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemotingServer),"Server.RemotingServer",WellKnownObjectMode.Singleton);
Console.ReadLine();
TcpServerChannel Channel = new TcpServerChannel(serverPort);
ChannelServices.RegisterChannel(Channel, false);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemotingServer),"Server.RemotingServer",WellKnownObjectMode.Singleton);
Console.ReadLine();
现在的问题是,Web 和 RemontingServer 都是部署在外网,有一个客户端程序需要通过 Remoting 来连接到外网到 RemotingServer ,这时需要将服务端的代码修改如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
string serverIP =
"40.1.1.11" ; //外网IP
string serverPort =
"10000" ;
var
properties =
new Dictionary<
string ,
string >();
properties [
"machineName" ] = serverIP;
properties [
"port" ] = serverPort;
var sinkProvider =
new BinaryServerFormatterSinkProvider();
var Channel =
new TcpServerChannel(
properties , sinkProvider);
ChannelServices.RegisterChannel(Channel,
false );
RemotingConfiguration.RegisterWellKnownServiceType
(typeof(RemotingServer),
"Server.RemotingServer" ,
WellKnownObjectMode.Singleton);
Console.ReadLine();
像上面这样修改后,本地客户端可以正常连接 RemotingServer ,但部署在外网的Web就不能访问 RemotingServer 了。如果将上面代码的 serverIP
修改成内网 IP ,外网 Web 可以访问,本地客户端又不能访问了。最后的解决方法是:
1、Remoting 服务端代码中的 serverIP
使用服务器的机器名,假设机器名为 RemotingServer ,代码如下:
string serverIP =
"RemotingServer" ; //服务器机器名
string serverPort =
"10000" ;
var
properties =
new Dictionary<
string ,
string >();
properties [
"machineName" ] = serverIP;
properties [
"port" ] = serverPort;
var sinkProvider =
new BinaryServerFormatterSinkProvider();
var Channel =
new TcpServerChannel(
properties , sinkProvider);
ChannelServices.RegisterChannel(Channel,
false );
RemotingConfiguration.RegisterWellKnownServiceType
(typeof(RemotingServer),
"Server.RemotingServer" ,
WellKnownObjectMode.Singleton);
Console.ReadLine();
2、修改本地 hosts 文件,将外网 IP 40.1.1.11
映射为 RemotingServer