Remoting技术问题,在第二次客户端激活远程组件时,前一次调用远程组件所得到的CallContext中的对像被清成掉??Why

DalyQiao 2006-10-21 12:21:14
以下是我为了在服务端和客户端中通过CallContext进行传送的类型定义
[Serializable]
public class UserToken : ILogicalThreadAffinative
{

public SqlGuid m_Session;

public UserToken(SqlGuid session)
{
m_Session = session;
}

public SqlGuid SessionId
{
get
{
return m_Session;
}
set
{
m_Session = value;
}
}

//以下两个函数是据微软的文档所说的解决方法,不过一点也没有效果,不知错在那里了.
public new int GetHashCode()
{
return base.GetHashCode();
}

public new Type GetType()
{
return base.GetType();
}
}

原先我以为CallContext中的传输的对像会一直保留,结果确不是这样.过程如下:
我设计了一个服务组件,其中一个方法会调用CallContext.SetData存入一个上述类型的对象,客户端也可以正常调用CallContext.GetData得到这个对象,然而当我再次应用客户端激活一个新的服务端对象时,CallContext中的数据确被清掉了,并得到提示"试图访问调用方不可访问的字段",为什么会这样?微软的文档说如果类型不实现ILogicalThreadAffinative接口,就不会被清掉,但不能进行远程传送,对我没什么意义.
我希望这个对像总是被传送,而不会被清掉.因为我希望它用于标识客户会话标识,表示客户是经过验证的合法客户.
...全文
303 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
股神 2006-10-22
  • 打赏
  • 举报
回复
DalyQiao 2006-10-21
  • 打赏
  • 举报
回复
找到问题了,是public SqlGuid m_Session;惹得祸,改成public string m_Session;就没事了.
怪,System.Data.SqlTypes.SqlGuid类型是支持序列化的,而且从服务端传到客户端没事,但从客户端传到服务端就有问题了(会提示那个"试图访问调用方不可访问的字段"错误,然后CallContext中的Sessionid数据项就被清掉了),不懂出了什么问题.我用的是.net 2.0版本,vs2005开发.
以下是服务端代码:
[Serializable]
public class UserToken : ILogicalThreadAffinative
{

public string m_Session;

public UserToken(SqlGuid session)
{
m_Session = session.ToString() ;
}

public SqlGuid SessionId
{
get
{
return new SqlGuid(m_Session);
}
set
{
m_Session = value.ToString();
}
}
}

//登陆的远程激活类,登陆成功后将返回一个令牌,并有意在后期也加入一个相关的客户ip地址的验证,而不止是会话标识

public class LoginVerification : MarshalByRefObject
{
public UserToken Login(string username, string pwd)
{
SqlConnection conn = DBConnString.Conn;
SqlCommand comm = new SqlCommand("bLogin", conn);
comm.CommandType = CommandType.StoredProcedure;

SqlParameter pUname = new SqlParameter( "@Uname",SqlDbType.VarChar , 50 );
pUname.Direction = ParameterDirection.Input;
pUname.Value = username;
comm.Parameters.Add(pUname);

SqlParameter pPwd = new SqlParameter("@Pwd", SqlDbType.VarChar, 1024);
pPwd.Direction = ParameterDirection.Input;
pPwd.Value = pwd;
comm.Parameters.Add(pPwd);

SqlParameter pSessionid = new SqlParameter("@Sessionid", SqlDbType.UniqueIdentifier);
pSessionid.Direction = ParameterDirection.Output;
comm.Parameters.Add(pSessionid);

try
{
comm.ExecuteNonQuery();
if (pSessionid.Value == DBNull.Value )
{
throw new Exception("用户名或密码不正确");
// return null;// new UserToken(SqlGuid.Null);
}
else
{
UserToken temp = new UserToken(new SqlGuid(pSessionid.Value.ToString()));
CallContext.LogicalSetData("Sessionid", temp);
return temp;
}
}
catch (SqlException sqlerr)
{
throw new Exception("运行时数据库出错:"+sqlerr.Message);
}
finally
{
conn.Close();
comm.Dispose();
}
}
}

客户端与服务端均很普通,没什么特别的地方.
KJ_Wang 2006-10-21
  • 打赏
  • 举报
回复
原代码全部搞出来,帮你交流,我也喜欢Remoting
winner2050 2006-10-21
  • 打赏
  • 举报
回复
帮顶
源码链接: https://pan.quark.cn/s/8ddf8a1c92f9 **libcurl用于获取大型文件**libcurl作为一个开源的C语言库,提供了一系列的API来处理与URL相关的任务,涵盖了HTTP、FTP、SMTP等多种网络协议的应用。在执行大型文件的下载操作,libcurl展现出卓越的性能表现和高度的灵活性,能够高效地管理大文件传输过程,有效预防内存溢出及其他潜在问题。**libcurl的基础操作**libcurl的基础应用包括以下几个环节:1. **初始化**:需要借助`curl_global_init()`函数来启动libcurl的工作环境。2. **建立会话句柄**:通过`curl_easy_init()`函数创建一个会话句柄,该句柄将用于后续所有的操作流程。3. **配置选项**:运用`curl_easy_setopt()`函数来设定多种参数,例如目标URL、超间、重试次数以及数据写入的回调函数等。4. **执行请求**:调用`curl_easy_perform()`函数来实施下载操作。5. **释放资源**:使用`curl_easy_cleanup()`函数来释放已经占用的资源。**获取大型文件的重要设置**1. **数据写入回调函数**:在处理大型文件下载,通常不希望一次性将整个文件载入内存。可以配置`CURLOPT_WRITEFUNCTION`选项,指定一个回调函数来处理接收到的数据片段,这样libcurl在接收到数据调用该函数,使得我们可以按需将数据写入文件或缓冲区。2. **缓冲策略**:可以设定缓冲区的大小(比如,通过`CURLOPT_BUFFERSIZE`),来控制每次接收数据的数量,从而优化内存...
内容概要:本文档整合了《鬼谷子·决篇》与《三略·审权变第三》《差德行第四》三大古代智慧典籍,构建了一套“决策+形势+用人”三位一体的领导力提升体系。通过28天三合实战路径、三维诊断工具、9个实用模板及独特的“身体锚点”仪式,系统解决管理者在决策犹豫、形势误判、人岗错配等方面的痛点。全文涵盖理论溯源、方法论拆解(如三步决策法、审权变四步法、差德行四步法)、历史案例对照(范蠡 vs 项羽)以及跨资源联动建议,形成从认知到实践的完整闭环。; 适合人群:基层管理者、创业者、职场进阶者,尤其是面临决策困境、环境适应困难或团队用人问题的人群;具备一定管理经验或自我提升意识的个体亦可受益。; 使用场景及目标:① 提升重大事项的决策质量,避免反复纠结与事后后悔;② 增强对外部环境变化的敏感度与应对能力,实现灵活调整;③ 科学评估人才德才素质,实现人岗精准匹配,减少用人失误;④ 构建个人化的决策-应变-用人标准化流程(SOP)。; 阅读建议:建议按照28天路径逐步实践,结合自测表定位短板,优先突破薄弱模块;配套工具模板需实际填写使用,配合身体锚点仪式强化行为记忆;可与“诸葛亮决策术”“立将威信术”等单品联动,全面提升领导力体系。

111,131

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧