有两个工程,就叫做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),才能解决该问题,谢谢高手指点!

解决方案 »

  1.   

    看了lz的代码,不是很明白你要干什么。
    不知道你是想学习WebService还是,想学习Remoting
      

  2.   

    LZ是准备把Remoting通信做成Web Service吗Web Service是基于Soap协议传输的,也就是XML而你使用的是Tcp通道进行注册的,而Tcp通道是基于二进制流传输的你可以把Tcp通道改为Http通道试下,Http通道是基于XML进行数据传输的以上仅提供参考LZ有时间的话可以去了解下Remoting和Web Service数据传输的机制
      

  3.   

    to chenguangxi() ,谢谢你的建议。
    以上的代码只是我为了说明问题临时写的demo,其逻辑符合我真实的项目需求。目前的问题是这样:H1服务器上已经实现了基于TCP注册的RemotingService,现在我要在H2服务器上发布一个WebService接口,该接口内部调用H1上实现的RemotingService。我现在想求得一种方法,使得H2上的WebService可以成功调用H1上的RemotingService,希望有高人相助!
      

  4.   

    [WebMethod] 加个缓存参数。试试。
      

  5.   

    因为webservice默认调用完资源就被回收了。
    这样子remoting,就没注册通道了。
      

  6.   

    如果要关闭Remoting的服务,则需要注销通道,也可以关闭对通道的监听。在Remoting中当我们注册通道的时候,就自动开启了通道的监听。而如果关闭了对通道的监听,则该通道就无法接受客户端的请求,但通道仍然存在,如果你想再一次注册该通道,会抛出异常。
      

  7.   

    各位能否给个具体的实现方法?Webmethod的这些属性我均试过了
    BufferResponse 
    CacheDuration 
    EnableSession
    问题依旧。另外,并不是重复注册一个端口的异常。
      

  8.   

    //获得当前已注册的通道;
                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中,是允许同时注册多个通道的
      

  9.   

    to:van_yi() 
    谢谢你的答复,我知道怎么关闭监听,也知道可以同时注册多个通道。
    目前的问题是,在我的WebMethod中不能注册通道,这个通道也不是用来监听的,其实是用来连接远端另一个服务通道的。
      

  10.   

    目前可以确认是我本机webservice环境的问题,不过究竟是环境哪里配置有问题还望高人指点 
    先结贴了,另发帖求助^_^
      

  11.   

    问题已经解决。
    经过我反复细致深入艰辛的跟踪,终于将问题的根源揪了出来:公司内部的VPN惹的祸!原来公司开发的VPN系统在提供外网访问跟踪的同时对网络端口的监控比较变态,退出VPN后便不会产生该异常。
    特别跟贴说明一下,谢谢大家这些天的支持!