请教高手关于.NET开发三层数据库中调用远程对象方法出现的问题 ( 积分: 10 )

  • 主题发起人 主题发起人 wujun510
  • 开始时间 开始时间
W

wujun510

Unregistered / Unconfirmed
GUEST, unregistred user!
我在调用远程对象的其中一个方法时出现如下错误:
[red]未处理的“System.Runtime.Serialization.SerializationException”类型的异常出现在 mscorlib.dll 中。
其他信息: 由于安全限制,无法访问类型 System.Runtime.Remoting.ObjRef。"

"调用目标异常"[/red]
我的程序大致是这样的:
在服务器上注册HTTP通道和远程服务对象.同样在客户端也注册HTTP通道.在调用有的方法时也正常,未出现上述错误.
请教有这方面经验的程序员.客户端如何调用远程对象(.DLL)的方法.如何创建远程服务对象.构造三层数据库模式(用TCP或HTTP通道).
声明:
1。对象中的方法是没有错的.
2。主要是这些方法转递参数(条件)来提取远程数据库中符合条件的数据记录是出现上述错误提示
3.调用不带参数的方法直接提取远程数据库中所有数据记录是确没有错误.
4.调用提交数据库方法时(有参数)也没有错误提示.
真不知道原因啊!请假高手!
 
我在调用远程对象的其中一个方法时出现如下错误:
[red]未处理的“System.Runtime.Serialization.SerializationException”类型的异常出现在 mscorlib.dll 中。
其他信息: 由于安全限制,无法访问类型 System.Runtime.Remoting.ObjRef。"

"调用目标异常"[/red]
我的程序大致是这样的:
在服务器上注册HTTP通道和远程服务对象.同样在客户端也注册HTTP通道.在调用有的方法时也正常,未出现上述错误.
请教有这方面经验的程序员.客户端如何调用远程对象(.DLL)的方法.如何创建远程服务对象.构造三层数据库模式(用TCP或HTTP通道).
声明:
1。对象中的方法是没有错的.
2。主要是这些方法转递参数(条件)来提取远程数据库中符合条件的数据记录是出现上述错误提示
3.调用不带参数的方法直接提取远程数据库中所有数据记录是确没有错误.
4.调用提交数据库方法时(有参数)也没有错误提示.
真不知道原因啊!请假高手!
 
最好能看一下源代码。
从你给的信息看:远程调用的通道是正确建立了。可能是由于方法中的参数或者返回值不能支持序列划造成的。
Host在IIS中的远程调用很难调试和使用,建议用一个单独的Windows service,会免除很多头疼的事情。
 
To:redforks
具体源程序:
一.远程对象:(其中一个方法.调用时出现上述错误提示)dataconn.dll
**********************************************************************
public System.Data.DataTable returnusertable()//此方法未报错
{

System.Data.DataTable usertable=new DataTable();
open();
information="系统正在加载用户信息.........";
sqlda=new SqlDataAdapter("select * from yhb",sqlconn);
sqlda.Fill(usertable);
close();
return usertable;
}
*******************************************************************************
public System.Data.DataTable returnusertable(string sqlstr)//此方法调用时报错
{

System.Data.DataTable usertable=new DataTable();
open();//打开数据库连接
//"select * from yhb"
information="系统正在加载用户信息.........";
sqlda=new SqlDataAdapter(sqlstr,sqlconn);//sqlconn 是SqlConnection一个实例,sqlda是SqlDataAdapter一个实例
sqlda.Fill(usertable);
close();//关闭数据库
return usertable;
}
*****************************************************************************
public void UpdateDataSource(DataTable Changerows)//此方法未报错
{
try
{
open();
this.sqlda.Update(Changerows);
}
catch(System.Exception E)
{
throw new Exception(E.Message);
}
finally
{
close();
}
二.服务器server
主要代码:注册HTTP/TCP通道
if (this.radioButton1.Checked)
{
TcpChannel tcp=new TcpChannel(8085);
Channelse
rvices.RegisterChannel(tcp);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(dataconn.dataClass),"Dataconn",WellKnownObjectMode.SingleCall);
this.statusBarPanel1.Text="系统正在启动"+this.radioButton1.Text;
}
else
{
HttpChannel http=new HttpChannel(8086);
Channelse
rvices.RegisterChannel(http);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(dataconn.dataClass),"Dataconn",WellKnownObjectMode.SingleCall);

this.statusBarPanel1.Text="系统正在启动"+this.radioButton2.Text;
}
三.客户端.Client
主要代码:
注册HTTP通道(TCP通道类似)
public class ClientClass
{
public static dataconn.dataClass dtconn;//声明静态远程对象变量
public ClientClass()
{
//
// TODO: 在此处添加构造函数逻辑
//

HttpChannel httpchan = new HttpChannel();
Channelse
rvices.RegisterChannel(httpchan);
dataconn.dataClass dtconntemp1 = (dataconn.dataClass)Activator.GetObject(typeof(dataconn.dataClass), "http://192.168.0.25:8086/Dataconn");
if (dtconntemp1!=null)
{

dtconn=dtconntemp1;//在构造函数中将激活的远程对象赋给静态远程对象变量.供客户端调用其方法.
return;
}
}
我的问题是:
为什么有时调用有参数的方法就提示错误呢(如上述第二个方法)?为什么有时调用有参数的方法不报错呢(如上述第三个方法)?调用没有参数的方法都不报错.
请教有这方面经验的程序员指点一下.万分谢谢!
 
我想你把程序里清晰了,问题就解决了。应该把数据库连接对象和DataAdapter放在函数中定义,不要作为类成员。在两个函数中,你对DataAdapter对象的使用方法不一样,可能是出错的真正原因。远程调用的服务对象最好是无状态的,虽然你用WellKnownObjectMode.SingleCall避免了多线程问题。改成无状态的就可以使用更高效的WellKnownObjectMode.SingleInstance模式。
public DataTable returnusertable(string sqlstr)
{
DataTable usertable = new DataTable();
SqlDataAdapter adapter = new SqlDataAdapter(sqlstr, "连接字符串");
adapter.Fill(usertable);

return usertable;
}
这样是不是看上去清楚点,把三个方法都按照类似的方法修改一下,只使用局部变量。然后再测试。
 
还有,你这样做必须把服务器端的dll也发布到客户端去,也不太好。建议先给远程调用定义一个接口,然后服务器端实现这个接口,客户端只获得这个接口的引用。把这个接口定义在一个单独的Assembly里,服务器端和客户端都共享这个接口dll。这样只要接口不改,就不用重新发布接口dll。服务器端和客户端之间的耦合就不会太强了。
 
感谢redforks的关注,我已给您加分,我再去改一下程序.
 
我想问redforks一下:我原先写服务器端的dll是继承MarshalByRefObject类,如果改写接口,是否要继承其他接口呢!
 
后退
顶部