ashx写入服务器文件Session丢失的求助

nikolaichow 2020-04-16 03:54:02
ashx使用context.Session[newToken] = loginName;保存令牌,若程序需要将一部分内容写入服务器的外部文件,再次访问此ashx时,context.Session[newToken] 就为null值,若不写入外部文件或者仅读取外部文件,context.Session[newToken] 不为null,下示例中的writeFile(newToken, loginName);代码不能执行,若执行则context.Session[newToken]消失

web.config中增加了<sessionState mode="InProc" timeout="1800"></sessionState>也不行

其次我还发现,这种情况若使用HttpRuntime.Cache或者static同样存在此问题。


using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.SessionState;
using System.Xml;

namespace ECInterSys
{
/// <summary>
/// testSession 的摘要说明
/// </summary>
public class testSession : IHttpHandler,IRequiresSessionState
{

public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
string login = context.Request["login"];
if (login!=null&&login.Equals("yes"))
{
string loginName = context.Request["loginName"];
//string pwd= context.Request["pwd"];
//.....验证用户密码正确性
string newToken = Guid.NewGuid().ToString();
context.Session[newToken] = loginName;
//writeFile(newToken, loginName);//这个是写入服务器外部文件的demo,若执行这一句话,则再次访问时context.Session[token]==null
context.Response.Write(newToken);
return;
}
string token = context.Request["token"];
if (!string.IsNullOrEmpty(token))
{
//验证令牌
if (context.Session!=null&& context.Session[token]!=null)
{
context.Response.Write(context.Session[token]);
return;
}
}
context.Response.Write("hello!");
}
//测试Session存储若写入本地文件则Session消息
//示例中写入本地文件的内容仅供参考,实际使用中不写登录信息
//示例仅仅是表示需要写外部文件
private void writeFile(string token,string loginName)
{
string fileName= string.Format(@"{0}bin\outerFile", AppDomain.CurrentDomain.BaseDirectory.ToString());

try
{
XmlDocument xml = new XmlDocument();
if (!File.Exists(fileName))
{
XmlDeclaration declaration = xml.CreateXmlDeclaration("1.0", "GB2312", "");//xml文档的声明部分
xml.AppendChild(declaration);
XmlElement xeRoot = xml.CreateElement("root");//创建一个<thumb>节点
xml.AppendChild(xeRoot);
}
else
xml.Load(fileName);
XmlNode xnRoot = xml.SelectSingleNode("//root");
XmlElement xeSub = xml.CreateElement("item");
xeSub.SetAttribute("ID", token);
xeSub.SetAttribute("loginName", loginName);
xml.Save(fileName);
}
catch(Exception ex)
{
throw ex;
}
}

public bool IsReusable
{
get
{
return false;
}
}
}
}
...全文
1212 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ying1234 2020-04-18
  • 打赏
  • 举报
回复
这种情况若使用HttpRuntime.Cache或者static同样存在此问题 。你都发现这样的结果了,要自已分析啊,什么情况下Cache,static会丢失值?你首先想到的就是应用程序重启,那么应用程序什么时候会被重启?除了手动重启iis等情况,还有什么?。。。。
ying1234 2020-04-18
  • 打赏
  • 举报
回复
context.Session!=null&& context.Session[token]!=null 晕。 你文件写到bin目录里了?晕,快点换掉。写到站点目录以外吧。
闭包客 2020-04-18
  • 打赏
  • 举报
回复
你这种情况就是改变 bin 目录的文件导致站点重启了。
闭包客 2020-04-18
  • 打赏
  • 举报
回复
其实 session 的丢失不外乎两种情况,一种是设置的和读取的,不是一个网站的 session,也就是不在一个应用程序池里面,还有一种更常见的就是应用程序池发生了回收。控制应用程序池的回收,并不是在 web.config 里面做了设置就足够的,还要在 iis 里面做两个必要的设置: http://bibaoke.com/post/66
ying1234 2020-04-18
  • 打赏
  • 举报
回复
<sessionState mode="InProc" timeout="1800"></sessionState>或者说你修改这里的配置,存别的地方去 3. InProc模式(缺省模式) <sessionState mode="InProc" cookieless="false" timeout="20"></sessionState> mode设置为"InProc"时,Session直接存储在IIS进程中,你应用程序如果重启,当然会丢失。   
wanghui0380 2020-04-17
  • 打赏
  • 举报
回复
根据大然然道德帝最高指示 1.我们无法告诉你,根据测试,session有值,存的就是null,因为你设置存loginname,但上面context.Request["loginName"];并未保证他不是null(根据大然然道德帝的道德标准,此处为严重鄙视新人不测试,不写断言)
wanghui0380 2020-04-17
  • 打赏
  • 举报
回复
根据大然然道德帝最高指示 1.我们无法告诉你,路径问题
引用
private void writeFile(HttpContext context,string token, string loginName) { FileInfo file=new FileInfo(context.Request.MapPath("~/App_Data/temp.txt")); using (FileStream fs= file.Open(FileMode.Append,FileAccess.Write, FileShare.ReadWrite)) { byte[] buffer = Encoding.UTF8.GetBytes(DateTime.Now.ToString()); fs.Write(buffer,0,buffer.Length); } }
2.我们无法告诉你 根据调试, if (context.Session!=null&& context.Session[token]!=null)此处有问题,实际session有值,这无疑是怀疑新人根本不会下断点调试 3.我们无法告诉你,不建议使用文本。因为文本并发读写并好操作,请换用mssql数据库或redis来保存session,这无疑是怀疑新人根本没有能力处理文本并发问题
wanghui0380 2020-04-17
  • 打赏
  • 举报
回复
根据大然然道德帝最高指示,我们无法对你提问做出任何猜测性建议,因为这无疑怀疑你为弱智,属于欺负新人,教训新人的典型回复 所以我们无法告诉你,是否应该先检查文件目录是否具有写入权限。 我们也无法告诉你 string fileName= string.Format(@"{0}bin\outerFile", AppDomain.CurrentDomain.BaseDirectory.ToString()); 此代码实际可能会有问题,因为这是怀疑你小学没毕业,不知道网站项目的实际运行目录为系统盘的asp.net temp目录,直接给物理路径也有可能超出web服务器的权限管理范围
by_封爱 2020-04-17
  • 打赏
  • 举报
回复
首先 我们一般把session保存到服务中 而不是进程中. mode="StateSetver" 并且开启asp.net_state服务. 其次..就算你用InProc 也不会出现session马上丢的问题. 所以 你这2次请求 是一个会话吗?

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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