各位,我在做一个项目的时候采用了Remoting(http),IIS做为宿主,但是性能很差,速度很慢,不知道大家有没有什么好的建议(针对Remoting)?还有就是Remoting的Tcp协议支持外网访问吗?如果支持,我在服务器上需要设置什么?因为前段时间我也是采用了Tcp,但是外网就是不能访问,老是报连接超时,远程服务器未响应错误,不知道怎么回事?

解决方案 »

  1.   

    防火墙是个因素——追求性能,就别考虑.Net,这家伙狂吃资源~~
      

  2.   

    按照你的意思那TCP应该可以访问外网的了?
      

  3.   

    Remoting的Tcp协议不支持外网!Remoting解释不了文本格式,通不过防火墙.性能很差?用webService都没有这种感觉...
      

  4.   

    带宽问题,webService虽然性能不如直接的TCP,但应该还算承受的了,并发几十个用户才是可以的,但比起楼主的外网访问,估计带宽的影响导致系统慢的原因更为重要。
      

  5.   

    客户端的app.Config代码
    <client>
          <wellknown type="Public.BaseData.clsBaseData,Public" url="http://localhost/Remoting/clsBaseData.soap" />
          </client>      <channels>
            <channel ref="http" />
          </channels>服务端的Web.Config代码
          <service>
    <wellknown mode="SingleCall" type="Public.BaseData,Public" objectUri="clsBaseData.soap"/>
          </service>
          <channels>
            <channel ref="http"/>
          </channels>我配置文件代码是这样写的,各位帮忙看看有没有什么问题?主要是性能上的问题,访问没有问题的
      

  6.   

    不好意思服务器配置文件代码写错了哈哈,现改正:
    <service>
    <wellknown mode="SingleCall" type="Public.BaseData.clsBaseData,Public" objectUri="clsBaseData.soap"/>
          </service>
          <channels>
            <channel ref="http"/>
          </channels>
      

  7.   

    我把SingleCall改成Singleton也没有用,把.soap改成.Rem也解决不了问题,而且现在我都是在本机调试的,所以不存在外网访问带宽导致性能下降这样的问题
      

  8.   

    TCP通道可以访问外网的服务器,可能是防火墙阻挡了的原因。
      

  9.   

    你在Remoting中传DataSet吗?如果有,在.NET 2.0中DataSet有一个Property (RemotingFormat)设置成SerizationFormat.Binary数据包小一些,可以提高性能.myDataSet.RemotingFormat = SerializationFormat.Binary;还有,无论用哪种Channel(HTTP或TCP),选Binary的Format效率更高些.你在用TCP Channel的时候,防火墙上需要打开它所用的相应的端口.
      

  10.   

    ERPCoder(Most Valuable Player) 说:Remoting的Tcp协议不支持外网!Remoting解释不了文本格式,通不过防火墙.wzd24(牧野)(衣带渐宽终不悔,为伊消得人憔悴) :TCP通道可以访问外网的服务器,可能是防火墙阻挡了的原因。我觉得很奇怪,我服务器上面没有架设任何防火墙啊,端口也没有进行任何设置,瑞星我都关掉了,但是还是没有用,用Tcp就是访问不了,真的很奇怪,是不是要在配置文件里面加入一些什么格式转换代码呢?
    以下是我在服务器配置文件中加了一段代码:
    clientProviders>
                <formatter ref="binary"/>
              </clientProviders>
              <serverProviders>
                <formatter ref="binary" typeFilterLevel="Full" />
              </serverProviders>
    但还是不行。
      

  11.   

    LZ用Remoting传递的是MarshalByReference 的东西还是 Searilized的By Value的东西?
      

  12.   

    按照RedGoldFish(红金鱼) 所说:想用Tcp协议,就只能在路由器等设备或软防火墙上手工开通端口了?
      

  13.   

    如果是Windows XP,它自己就带一个防火墙,需要打开相应应的端口或整个关掉
      

  14.   

    服务器是Win2000 Server ,客户端是XP
      

  15.   

    如果传MarshalByRefObject,你的机器上有几个网卡(或者说IP地址)?多个的时候需要一些特殊设置.
      

  16.   

    <channel ref="tcp" machineName ="PC Name" port="29087">
              <serverProviders> 
                <formatter ref="binary" typeFilterLevel="Full" />
               </serverProviders>
    </channel>
    多个的时候需要这个: machineName ="PC Name"
      

  17.   

    注意: machineName 大小写敏感.不能写错.
      

  18.   

    对,TCP的配置文件.例如: <system.runtime.remoting>
     <application>
     <lifetime
      leaseTime="60S"
      sponsorshipTimeout="30S"
      renewOnCallTime="30S"
      leaseManagerPollTime="20S"/>
      <channels>
          <channel ref="tcp" machineName ="我的机器名" port="29087">
              <serverProviders> 
                <formatter ref="binary" typeFilterLevel="Full" />
               </serverProviders>
          </channel>
       </channels>
     </application>
      </system.runtime.remoting>
      

  19.   

    machineName ="我的机器名" 客户端也加上没有害处.都加上就行.
      

  20.   

    另外,你从你的客户机器可以Ping到你的服务器吗?
      

  21.   

    客户端:
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <appSettings>
        <add key="ConnectionString" value="Server = (local);Database = erp20070607154958560;Uid = sa;PWD = "/>
      </appSettings>  <system.runtime.remoting>
        <application>
            <wellknown type="crmPublic.BaseData.clsBaseData,crmPublic" url="Tcp://IP:29087/clsBaseData" /><!--基础数据-->
          </client>
          <lifetime
            leaseTime="10S"
            sponsorshipTimeout="10S"
            renewOnCallTime="10S"
            leaseManagerPollTime="10S"/>      <channels>
            <channel ref="Tcp" machineName ="ERPSERVER" port="29087"/>
            <clientProviders>
            <formatter ref="binary"/>
            </clientProviders>
            <serverProviders>
              <formatter ref="binary" typeFilterLevel="Full" />
            </serverProviders>
          </channels>
        </application>
        <customErrors mode="remoteOnly"/>
      </system.runtime.remoting>
      </configuration>
      

  22.   

    服务器配置文件:
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <appSettings>
        <add key="SystemName" value="2B0E3BE1B99CE4F9371B451D06A7B98D949DBB64649112A8E5A953876BCA92A6E3259074524BFB91"/>
        <add key="ConnectionString" value="Server = (local);Database =ERP20070607154958560;Uid = sa;PWD = "/>
      </appSettings>  <system.runtime.remoting>
        <application name ="CRMService">
          <service>
            <wellknown mode="SingleCall" type="crmPublic.BaseData.clsBaseData,crmPublic" objectUri="clsBaseData"/>
          </service>
          <channels>
            <channel ref="tcp server" machineName ="ERPSERVER" port="29087" >
              <clientProviders>
                <formatter ref="binary"/>
              </clientProviders>
              <serverProviders>
                <formatter ref="binary" typeFilterLevel="Full" />
              </serverProviders>
            </channel>
          </channels>
        </application>
        <customErrors mode="off"/>
      </system.runtime.remoting>
    </configuration>
      

  23.   

    用这个代码试一下:IDictionary tcpProperties = new Hashtable();
    tcpProperties["name"] = "tcpBinary";
    tcpProperties["port"] = 8888;
    tcpProperties["rejectRemoteRequests"] = false;
    tcpProperties["bindTo"] = 外网IP; //注:使用IP地址绑定时将无法使用其它IP地址连接
    BinaryClientFormatterSinkProvider tcpClientSinkProvider = new BinaryClientFormatterSinkProvider();
    BinaryServerFormatterSinkProvider tcpServerSinkProvider = new BinaryServerFormatterSinkProvider();
    tcpServerSinkProvider.TypeFilterLevel = TypeFilterLevel.Full;
    TcpChannel tcpChannel = new TcpChannel(tcpProperties,tcpClientSinkProvider,tcpServerSinkProvider);
      

  24.   

    <wellknown type="crmPublic.BaseData.clsBaseData,crmPublic" url="Tcp://IP:29087/clsBaseData" />中的IP应该是真正的IP或机器名吧?比如:
    <wellknown type="crmPublic.BaseData.clsBaseData,crmPublic" url="Tcp://ERPSERVER:29087/clsBaseData" />还有:  </client> 对应的开始  <client> 好象没有啊?
      

  25.   

    IP是外网IP,</client> 对应的开始  <client>是有的,我不小心删除了哈哈
      

  26.   

    在客户端:<channel ref="Tcp" machineName ="ERPSERVER" port="29087"/>: machineName 应该是你客户机自己的机器名,不是服务器的机器名.我估计ERPSERVER"是你服务器的机器名.
      

  27.   

    在客户端把machineName改成我机子的名称了,还是老样子
      

  28.   

    wzd24(牧野)(衣带渐宽终不悔,为伊消得人憔悴):你的代码好像Debug不过去啊
      

  29.   

    Seraph123() :Remoting主要是做远程以及分布式应用程序
      

  30.   

    回复人:devclub(OSen) ( 一级(初级)) 信誉:96  2007-06-12 17:03:01  得分:0

    wzd24(牧野)(衣带渐宽终不悔,为伊消得人憔悴):你的代码好像Debug不过去啊
    -------------------------------------
    我的代码是用代码来实现Remoting,而不是用Config文件来配置的!
    而且这是服务端的代码,客户端不用做改动,该什么样就什么样!
      

  31.   

    我没有把它放在配置文件里面,我是建了一个控制台应用程序进行Debug的
      

  32.   

    有关调用实时(JIT)调试而不是此对话框的详细信息,
    请参见此消息的结尾。************** 异常文本 **************
    System.Net.Sockets.SocketException: 由于连接方在一段时间后没有正确的答复或连接的主机没有反应,连接尝试失败。
      

  33.   

    我就直接建了一个ConsoleApplication,把代码粘贴上去,再把IP改成外网的,其他就没有动过了
      

  34.   

    我测试了一下问题就在客户端配置文件的那个IP,如果是外网的就不行,如果是内网的IP就一点问题也没有,郁闷死了
      

  35.   

    我们自己的产品由于外网通过防火墙和NAT访问的原因,从TCP的Channel换成了一个第三方的Channel.
      

  36.   

    大家好像都忘了
    他的服务程序是不是在IIS上阿????
      

  37.   

    wzd24(牧野)(衣带渐宽终不悔,为伊消得人憔悴) :服务端在外网上,有外网IP,客户端随便在哪里,但是不和服务端在同一个局域网里面。服务端有固定IP。我把程序服务端程序和客户端程序都放在服务端服务器上,配置文件中的IP如果写的是外网IP,那就不能访问了,如果写的是内网IP又可以访问了我在服务器上用telnet命令试了一下,居然只有少数几个系统默认端口(如80、3389等)是开放的,其他的全都通不过telnet命令,估计问题出在这个地方,不知道大家有没有什么好的办法开通一下默认不开放的端口?
      

  38.   

    我这儿有一篇文章关于设置防火墙后边的Remoting Server,也是TCP Channel,看看有没有帮助:
    http://www.glacialcomponents.com/ArticleDetails/CAOMN.aspx
      

  39.   

    回复人:devclub(OSen) ( 一级(初级)) 信誉:96  2007-6-12 18:42:04  得分:0
    ?  wzd24(牧野)(衣带渐宽终不悔,为伊消得人憔悴) :服务端在外网上,有外网IP,客户端随便在哪里,但是不和服务端在同一个局域网里面。服务端有固定IP。我把程序服务端程序和客户端程序都放在服务端服务器上,配置文件中的IP如果写的是外网IP,那就不能访问了,如果写的是内网IP又可以访问了我在服务器上用telnet命令试了一下,居然只有少数几个系统默认端口(如80、3389等)是开放的,其他的全都通不过telnet命令,估计问题出在这个地方,不知道大家有没有什么好的办法开通一下默认不开放的端口?-------------------------------------------------------------------------------
    是不是服务器上做了IP策略?还有Telnet不能连通没有监听的端口。所以测试出来的并不准确。