正在学习。能够把你的项目给我看看。学习学习。谢谢。[email protected]

解决方案 »

  1.   

    肯定是你的程序中包括了某些assembly,这个assembly没有放到client上.这个无法被serialize的对象的声明中的一部分或者整个申明都在里面,所以无法正确serialize。你要保证用到的assembly被全部被放到了client上去了。最好把这些assembly都放到GAC里面去,生了确认路径的麻烦。
      

  2.   

    谢谢 turnmissile(会翻跟头的导弹) 和 huangsuipeng(hsp-ec.net)虽然问题还在寻找,但你们指出了我忽试的一个问题,我在开发的机器上安装了服务端,把客户端的分发到局域网内的其他机器时客户端没有出现问题,我想可能是在开发机器上有些assembly,使序列化没有问题;而使用Internet上的服务器时由于开发机上拥有这些assembly,所以开发机的客户端运行也正常;而局域网的其他拥有客户端机器和Internet上用作服务端的机器都没有这些assembly所以导致serialize问题,正在测试非常感谢~~~
    [email protected]因为这是公司的项目所以不能用于交流,抱歉
      

  3.   

    目前问题还是没有解决,我把程序重新编译后返回的异常倒是变成了"返回的参数具有无效类型",本来存在的只要客户端或服务端均不在开发机就会出现的报异常问题也不存在。现在就是访问Internet上的服务器的服务端,客户端在开发机上一切正常,而且在开发机的另一操作系统(开发机装了win2000和winxp)上也正常。
    而且本问题一直和DataSet有关,所以我做了个只返回DataSet的服务端,结果和上面一样。查遍网络DataSet序列化没什么问题!
      

  4.   

    服务端程序(测试返回DataSet)
    ---------------------------------------------------------------------------------
    using System;
    using System.Data;namespace LCL.Test.RemotingTest
    {
    /// <summary>
    /// Class1 的摘要说明。
    /// </summary>
    public class C_RemotingServer:MarshalByRefObject
    {
    public C_RemotingServer()
    {
    //
    // TODO: 在此处添加构造函数逻辑
    //
    } //返回DataSet
    public DataSet ReturnDataSet()
    {
    DataTable workTable = new DataTable("Customers");
    workTable.Columns.Add("CustName", typeof(String));
    workTable.Columns.Add("CustAge", typeof(String));
    DataRow dr=workTable.NewRow();
    dr[0]="name";
    dr[1]="null";
    workTable.Rows.Add(dr);
    DataSet _set=new DataSet();
    _set.Tables.Add(workTable);
    return _set;
    }
    }
    }
    --------------------------------------------------------------------------------配置文件web.config
    --------------------------------
    <configuration>
    <system.runtime.remoting>
    <application>
    <service>
    <wellknown mode="Singleton" objectUri="RemotingTest.rem" type="LCL.Test.RemotingTest.C_RemotingServer, RemotingService" />
    </service>
    <channels>
    <channel ref="http" />
    </channels>
    </application>
    </system.runtime.remoting>
    </configuration>
    -------------------------------------
      

  5.   

    以下是异常信息:
    ---------------------------
    有关调用实时 (JIT) 调试而不是此对话框的详细信息,
    请参阅此消息的结尾。************** 异常文本 **************
    System.InvalidCastException: 返回参数具有无效的类型。
       at System.Runtime.Remoting.Proxies.RealProxy.ValidateReturnArg(Object arg, Type paramType)
       at System.Runtime.Remoting.Proxies.RealProxy.PropagateOutParameters(IMessage msg, Object[] outArgs, Object returnValue)
       at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
       at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
       at Info.Teach.DTS.C_DTService.ReturnDataSet()
       at Info.Teach.DTS.C_ClientWin.button1_Click(Object sender, EventArgs e)
       at System.Windows.Forms.Control.OnClick(EventArgs e)
       at System.Windows.Forms.Button.OnClick(EventArgs e)
       at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
       at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       at System.Windows.Forms.Control.WndProc(Message& m)
       at System.Windows.Forms.ButtonBase.WndProc(Message& m)
       at System.Windows.Forms.Button.WndProc(Message& m)
       at System.Windows.Forms.ControlNativeWindow.OnMessage(Message& m)
       at System.Windows.Forms.ControlNativeWindow.WndProc(Message& m)
       at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    ************** 已加载的程序集 **************
    mscorlib
        程序集版本:1.0.3300.0
        Win32 版本:1.0.3705.0
        基本代码:file:///c:/winnt/microsoft.net/framework/v1.0.3705/mscorlib.dll
    ----------------------------------------
    DTTClient
        程序集版本:1.0.1559.29569
        Win32 版本:1.0.1559.29569
        基本代码:file:///F:/IIS/DTTTest/client/DTTClient.exe
    ----------------------------------------
    System.Windows.Forms
        程序集版本:1.0.3300.0
        Win32 版本:1.0.3705.0
        基本代码:file:///c:/winnt/assembly/gac/system.windows.forms/1.0.3300.0__b77a5c561934e089/system.windows.forms.dll
    ----------------------------------------
    System
        程序集版本:1.0.3300.0
        Win32 版本:1.0.3705.0
        基本代码:file:///c:/winnt/assembly/gac/system/1.0.3300.0__b77a5c561934e089/system.dll
    ----------------------------------------
    System.Drawing
        程序集版本:1.0.3300.0
        Win32 版本:1.0.3705.0
        基本代码:file:///c:/winnt/assembly/gac/system.drawing/1.0.3300.0__b03f5f7f11d50a3a/system.drawing.dll
    ----------------------------------------
    System.Windows.Forms.resources
        程序集版本:1.0.3300.0
        Win32 版本:1.0.3300.0
        基本代码:file:///c:/winnt/assembly/gac/system.windows.forms.resources/1.0.3300.0_zh-chs_b77a5c561934e089/system.windows.forms.resources.dll
    ----------------------------------------
    DTTClassLib
        程序集版本:1.0.1559.29493
        Win32 版本:1.0.1559.29493
        基本代码:file:///F:/IIS/DTTTest/client/DTTClassLib.DLL
    ----------------------------------------
    System.Data
        程序集版本:1.0.3300.0
        Win32 版本:1.0.3705.0
        基本代码:file:///c:/winnt/assembly/gac/system.data/1.0.3300.0__b77a5c561934e089/system.data.dll
    ----------------------------------------
    System.EnterpriseServices
        程序集版本:1.0.3300.0
        Win32 版本:1.0.3705.0
        基本代码:file:///c:/winnt/assembly/gac/system.enterpriseservices/1.0.3300.0__b03f5f7f11d50a3a/system.enterpriseservices.dll
    ----------------------------------------
    System.Xml
        程序集版本:1.0.3300.0
        Win32 版本:1.0.3705.0
        基本代码:file:///c:/winnt/assembly/gac/system.xml/1.0.3300.0__b77a5c561934e089/system.xml.dll
    ----------------------------------------
    mscorlib.resources
        程序集版本:1.0.3300.0
        Win32 版本:1.0.3300.0
        基本代码:file:///c:/winnt/assembly/gac/mscorlib.resources/1.0.3300.0_zh-chs_b77a5c561934e089/mscorlib.resources.dll
    ----------------------------------------
    System.Data.resources
        程序集版本:1.0.3300.0
        Win32 版本:1.0.3300.0
        基本代码:file:///c:/winnt/assembly/gac/system.data.resources/1.0.3300.0_zh-chs_b77a5c561934e089/system.data.resources.dll
    ----------------------------------------
    System.resources
        程序集版本:1.0.3300.0
        Win32 版本:1.0.3300.0
        基本代码:file:///c:/winnt/assembly/gac/system.resources/1.0.3300.0_zh-chs_b77a5c561934e089/system.resources.dll
    ----------------------------------------
    System.Runtime.Remoting
        程序集版本:1.0.3300.0
        Win32 版本:1.0.3705.0
        基本代码:file:///c:/winnt/assembly/gac/system.runtime.remoting/1.0.3300.0__b77a5c561934e089/system.runtime.remoting.dll
    ----------------------------------------
    System.Data
        程序集版本:1.0.5000.0
        Win32 版本:1.1.4322.573
        基本代码:file:///c:/winnt/assembly/gac/system.data/1.0.5000.0__b77a5c561934e089/system.data.dll
    ----------------------------------------
    System
        程序集版本:1.0.5000.0
        Win32 版本:1.1.4322.573
        基本代码:file:///c:/winnt/assembly/gac/system/1.0.5000.0__b77a5c561934e089/system.dll
    ----------------------------------------
    System.Xml
        程序集版本:1.0.5000.0
        Win32 版本:1.1.4322.573
        基本代码:file:///c:/winnt/assembly/gac/system.xml/1.0.5000.0__b77a5c561934e089/system.xml.dll
    ----------------------------------------************** JIT 调试 **************
    若要启用实时 (JIT) 调试,此
    应用程序或计算机的配置文件 (machine.config) 的 
     system.windows.forms 节中必须设置 jitDebugging 值。
    编译应用程序时还必须启用
    调试。例如:<configuration>
        <system.windows.forms jitDebugging="true" />
    </configuration>启用 JIT 调试后,任何未处理的异常
    将被发送到此计算机上注册的 JIT 调试器,
    而不是由此对话框处理。
      

  6.   

    返回类型是DATASET还是DATASET的子类? 如果是子类的话有可能是子类没有部属到客户端。 还有一个可能的原因是序列化失败。 远程传递对象是需要序列化的。
      

  7.   

    返回的类型是DataSet,而且我刚才试着返回DataTable 也出现了异常,现在的问题是在局域网内所有的测试都是正确的,但调用Internet上的服务端时只有开发机上的客户端正常,局域网的其他机器都会报异常。
      

  8.   

    在Internet上直接传递DataSet是有问题的,通常办法是先把DataSet序列化后再进行传递,或是把它读成一个XML串,压缩后再传递。
      

  9.   

    因为现用的是IIS Host Remoting,并以二进制传递数据,不象SOAP安全,当然速度会快点,所以建议楼主要DataSet传递前的数据处理上下功夫.
      

  10.   

    在Remoting中已经自动帮你进行了序列化的事情,在网络中传输的就是序列化以后的数据。
    我在开发机上的客户端访问Internet上服务端一直都很正常,很明显DataSet在Internet中传输是没有问题的。
    现在非常让人奇怪的是为什么只有开发机上的客户端访问Internet上服务端是正常的~~~
    我一直在考虑是不是Internet服务器上的.Net运行环境问题,但是我没法想通如果是服务器有问题,为什么在开发机上的客户端调用又很正常,开发机是不是比其他的同局域网的机器多什么?
    如果多什么?那么为什么我把服务端和客户端部署在局域网内的其他两台机器间访问时又不会出现问题?
      

  11.   

    一个不是建议的建议:出错的客户端的Framework是1.0服务器端上的Framework是那个版本?1.1?
      

  12.   

    楼主的IIS认证方式是匿名访问?
      

  13.   

    IIS事匿名访问这个有问题吗?
     jerryfangsh(碎片) 我也认为是Framework的版本问题,但是我这台开发机器上的.Net版本是1.03,如果服务器是因为Framework1.1的问题,那么应该是我的这台开发机客户端报错才对~
    -------------------
    我现在安装Framework1.1和Framwork1.1 SDK,有个比较幼稚的问题我怎么知道VS.NET2002是用Framework1.1编译的或者说我用什么工具能够看到生成程序Framework版本号。
      

  14.   

    已经解决!!!谢谢各位! 尤其是jerryfangsh(碎片)。
    所有的问题的产生都是因为除了开发机上安装的是Framework1.03以外,其他同局域网内的机器都安装了Framework1.1和Framework1.03,刚才我在开发机上安装了Framework1.1后也是产生了“返回参数具有无效的类型”的异常在客户端的配置文件<configuration>节点中加入
    <startup>
            <requiredRuntime version="v1.1.4322"  />
    </startup>
    后问题解决。估计是System.Data类库的版本不协调造成。
    大家可以看下下面的文章,我一直认为自己只安装Framework1.03不存在下面的问题。
    http://www.dotnet247.com/247reference/msgs/32/164953.aspx 
    还有自己是考研考完刚来到这家公司对这里开发环境不熟,郁闷了一个多星期,引以为戒。但是我还有以下的疑问:
    1、大家可以看到因为Internet上的服务端所在的机器安装了Framework1.0和1.1而本地网的客户端同时安装了Framework1.0和1.1所以出现了问题。但为什么这样的问题不出现在局域网内,大家可以看到我做了在局域网内同时安装Framework1.0和1.1的两台电脑间的测试。
    2、大家还可以看到我把运行时强制到<requiredRuntime version="v1.1.4322"  />时不报错的,而在此以前这台开发机上一直是Framework1.0反而没问题;我试着改成<requiredRuntime version="v1.1.0375"  />时就抱错了。
    希望哪位牛人解释下Net的Framework版本控制问题
    以及这个比较幼稚的问题  怎么知道VS.NET2002开发的程序是用Framework1.1编译的
    或者说我用什么工具能够看到程序是用哪个版本Framework生成的。
    -------------------------------------------------------------------------------
    希望大家有个学习的机会明天此时再结帖。
      

  15.   

    你的开发机器和服务器的版本应该是一样的,所以不会出错。那么现在就是出错的那台是1.1的,而开发和服务器都是1.0的。当然,以上都是猜测。我是这样推断的:
    1、InvalidCastException在两种情况下出现,一个是显示类型转换时,目标类型和源类型不一致;另一个就是显示类型转换时,目标类型和源类型的版本不一致;
    2、在Remoting中,Proxy需要转换类型,分别发生在服务器端和客户端;首先服务器端将返回的数据序列化传输,到达客户端时,客户端的Proxy将数据反序列化为指定类型。DataSet是在服务器端被序列化的,序列化时带入了服务器端System.Data.DLL的版本号,假设是1.0;那么当在客户端反序列化时,Proxy会去找当前被设为使用状态的System.Data.DLL。如果客户端的是1.1,那么就会出现InvalidCaseException错误。VS.Net2002使用的都是Framework1.0,无法指定它使用1.1的。
    ILDasm.exe程序可以帮助你看Assembly的内部信息。
      

  16.   

    TO:jerryfangsh(碎片) 
    “你的开发机器和服务器的版本应该是一样的,所以不会出错。那么现在就是出错的那台是1.1的,而开发和服务器都是1.0的”
    我已经问过网管服务器端是1.1的,明天我再确认。
    再者如果服务器是1.0的我把客户端强制在v1.1.4322应该出错。
    <startup>
            <requiredRuntime version="v1.1.4322"  />
    </startup>
    而恰恰是现在如果是强制v1.0.375出错,如下
    <startup>
            <requiredRuntime version="v1.0.375"  />
    </startup>所以我一直很奇怪为什么开发机只有v1.0.375的时候反而能够很好的调用,而其他既装了1.0又装了1.1的反而异常。
    ILDasm.exe好像只能看到反汇编的程序本身的版本号,不是Framework的版本号:)