有两个工程,就叫做A和B吧,在A中实现了一个同步接口,在B中通过WebService发布这个接口(类HelloServer在独立的DLL中实现)。
测试时先启动A,再启动B(B是WebService),通过B调用A中提供的接口便会抛异常!若把B改成普通控制台程序,则不会出现这种情况。
// A的实现(简略会意)
public class Sample
{ public static int Main(string [] args)
{ TcpServerChannel chan = new TcpServerChannel( 10001 );
ChannelServices.RegisterChannel( chan );
RemotingConfiguration.RegisterWellKnownServiceType( typeof( HelloServer ), "SayHello", WellKnownObjectMode.SingleCall ); System.Console.WriteLine("点击 <enter> 退出...");
System.Console.ReadLine();
return 0;
}
}
// B的部分实现
[WebMethod]
public string HelloWorld()
{
TcpChannel chan = new TcpChannel();
ChannelServices.RegisterChannel( chan ); try
{
HelloServer obj = (HelloServer)Activator.GetObject(
typeof( HelloServer ),
"tcp://localhost:10001/SayHello" ); obj.Hello(); // 这时便会抛异常,异常信息在下面给出
}
catch( Exception ex )
{
string str = ex.ToString();
return str;
}
return "Hello World";
}// 类HelloServer的部分实现
public class HelloServer
{
public string Hello()
{
return "Hello!";
}
}
--------------异常信息-------------
System.Net.Sockets.SocketException: 无法加载或初始化请求的服务提供程序。Server stack trace:
at System.Net.Sockets.Socket..ctor(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType)
at System.Runtime.Remoting.Channels.RemoteConnection.CreateNewSocket()
at System.Runtime.Remoting.Channels.SocketCache.GetSocket(String machineAndPort)
at System.Runtime.Remoting.Channels.Tcp.TcpClientTransportSink.SendRequestWithRetry(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream)
at System.Runtime.Remoting.Channels.Tcp.TcpClientTransportSink.ProcessMessage(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream, ITransportHeaders& responseHeaders, Stream& responseStream)
at System.Runtime.Remoting.Channels.BinaryClientFormatterSink.SyncProcessMessage(IMessage msg)
---------------
若用普通控制台程序实现B工程,则一切正常
// 这样调用是正常的
public static int Main(string [] args)
{
TcpChannel chan = new TcpChannel();
ChannelServices.RegisterChannel( chan ); try
{
HelloServer obj = (HelloServer)Activator.GetObject(
typeof( HelloServer ),
"tcp://localhost:10001/SayHello" ); obj.Hello(); // 正常,
} catch( Exception ex )
{
string str = ex.ToString();
} return 0;
} ::怎样修改我的B工程(WebService),才能解决该问题,谢谢高手指点!
测试时先启动A,再启动B(B是WebService),通过B调用A中提供的接口便会抛异常!若把B改成普通控制台程序,则不会出现这种情况。
// A的实现(简略会意)
public class Sample
{ public static int Main(string [] args)
{ TcpServerChannel chan = new TcpServerChannel( 10001 );
ChannelServices.RegisterChannel( chan );
RemotingConfiguration.RegisterWellKnownServiceType( typeof( HelloServer ), "SayHello", WellKnownObjectMode.SingleCall ); System.Console.WriteLine("点击 <enter> 退出...");
System.Console.ReadLine();
return 0;
}
}
// B的部分实现
[WebMethod]
public string HelloWorld()
{
TcpChannel chan = new TcpChannel();
ChannelServices.RegisterChannel( chan ); try
{
HelloServer obj = (HelloServer)Activator.GetObject(
typeof( HelloServer ),
"tcp://localhost:10001/SayHello" ); obj.Hello(); // 这时便会抛异常,异常信息在下面给出
}
catch( Exception ex )
{
string str = ex.ToString();
return str;
}
return "Hello World";
}// 类HelloServer的部分实现
public class HelloServer
{
public string Hello()
{
return "Hello!";
}
}
--------------异常信息-------------
System.Net.Sockets.SocketException: 无法加载或初始化请求的服务提供程序。Server stack trace:
at System.Net.Sockets.Socket..ctor(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType)
at System.Runtime.Remoting.Channels.RemoteConnection.CreateNewSocket()
at System.Runtime.Remoting.Channels.SocketCache.GetSocket(String machineAndPort)
at System.Runtime.Remoting.Channels.Tcp.TcpClientTransportSink.SendRequestWithRetry(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream)
at System.Runtime.Remoting.Channels.Tcp.TcpClientTransportSink.ProcessMessage(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream, ITransportHeaders& responseHeaders, Stream& responseStream)
at System.Runtime.Remoting.Channels.BinaryClientFormatterSink.SyncProcessMessage(IMessage msg)
---------------
若用普通控制台程序实现B工程,则一切正常
// 这样调用是正常的
public static int Main(string [] args)
{
TcpChannel chan = new TcpChannel();
ChannelServices.RegisterChannel( chan ); try
{
HelloServer obj = (HelloServer)Activator.GetObject(
typeof( HelloServer ),
"tcp://localhost:10001/SayHello" ); obj.Hello(); // 正常,
} catch( Exception ex )
{
string str = ex.ToString();
} return 0;
} ::怎样修改我的B工程(WebService),才能解决该问题,谢谢高手指点!
解决方案 »
- c# GDI+ 叠加图的速度为什么那么慢,怎样提高速度??
- 开发中遇到的一个问题,把处理过程跟大家分享下
- 在SqlCommand中Parameters中如何将变量指定为空值?
- WindowsMediaPlayer无法快进
- TABLE与TREEVIEW的问题
- 求这个算法
- 为什么工具栏按钮上的小图标丢失了???
- ==>c#中如何打开一个可执行程序?就象VB里的SHELL函数一样....
- 这段代码为什么有错 --------请API高手看看???????
- DataGrid编辑更新数据问题,请各位高手指点!
- 请问:如何将RICHBOX内的数据用表格的格式写入到WORD模板中~小弟跪求了~
- 怎样获取ComboBox的第N项
不知道你是想学习WebService还是,想学习Remoting
以上的代码只是我为了说明问题临时写的demo,其逻辑符合我真实的项目需求。目前的问题是这样:H1服务器上已经实现了基于TCP注册的RemotingService,现在我要在H2服务器上发布一个WebService接口,该接口内部调用H1上实现的RemotingService。我现在想求得一种方法,使得H2上的WebService可以成功调用H1上的RemotingService,希望有高人相助!
这样子remoting,就没注册通道了。
BufferResponse
CacheDuration
EnableSession
问题依旧。另外,并不是重复注册一个端口的异常。
IChannel[] channels = ChannelServices.RegisteredChannels; //关闭指定名为MyTcp的通道;
foreach (IChannel eachChannel in channels)
{
if (eachChannel.ChannelName == "MyTcp")
{
TcpChannel tcpChannel = (TcpChannel)eachChannel; //关闭监听;
tcpChannel.StopListening(null); //注销通道;
ChannelServices.UnregisterChannel(tcpChannel);
}
}
代码中,RegisterdChannel属性获得的是当前已注册的通道。在Remoting中,是允许同时注册多个通道的
谢谢你的答复,我知道怎么关闭监听,也知道可以同时注册多个通道。
目前的问题是,在我的WebMethod中不能注册通道,这个通道也不是用来监听的,其实是用来连接远端另一个服务通道的。
先结贴了,另发帖求助^_^
经过我反复细致深入艰辛的跟踪,终于将问题的根源揪了出来:公司内部的VPN惹的祸!原来公司开发的VPN系统在提供外网访问跟踪的同时对网络端口的监控比较变态,退出VPN后便不会产生该异常。
特别跟贴说明一下,谢谢大家这些天的支持!