ASP.NET团队建议使用缓存而不是会话,我们在过去几年中停止使用会话来处理WebForm模型.所以我们通常在web.config中关闭会话
<sessionState mode="Off" />
Run Code Online (Sandbox Code Playgroud)
但是,现在当我使用此设置测试ASP.NET MVC应用程序时,它会SessionStateTempDataProvider在mvc框架内的类中抛出错误,它要求我打开会话状态,我做了并且它有效.查看它使用会话的来源:
// line 20 in SessionStateTempDataProvider.cs
Dictionary<string, object> tempDataDictionary =
httpContext.Session[TempDataSessionStateKey] as Dictionary<string, object>;
Run Code Online (Sandbox Code Playgroud)
那么,为什么他们会在这里使用会话?我错过了什么?
================================================== ======
编辑对不起这篇文章不是故意讨论会话与缓存,而是在ASP.NET MVC的上下文中,我只是想知道为什么会话在这里使用.在这篇博文中,Scott Watermasysk也提到关闭会话是一个很好的做法,所以我只是想知道为什么我必须从这里开启使用MVC.
我想这个问题听起来很熟悉,但我还是另一个被REST困惑的程序员.
我有一个传统的Web应用程序,从StateA到StateB等等.如果用户去了StateB的(URL),我想确保他之前访问过StateA.传统上,我使用会话状态执行此操作.
由于REST中不允许会话状态,我该如何实现?
我正在android中建立一个登录应用程序,我正在点击一个url(用户名和密码),直到那部分它工作正常,但在那之后每当我点击一个url(一旦用户被认证),它什么都不返回(即错误消息,请先登录).但它在非常相似的iPhone应用程序和浏览器上工作正常.
我得到的地方是phpSessionId的错误(即会话被销毁以获得进一步的请求)如果我们希望我们的Android应用程序在服务器端保持身份验证,我们需要在第一次连接后获取该ID,然后将其发送到我们所有后续请求的标题.
但问题是,我无法从第一个连接的标头获取sessionId,并发送带有标头的进一步请求.
请给我一些代码或链接来正确完成任务.谢谢.
当我尝试HttpContext从HUB 访问当前会话时它返回null.
我尝试使用界面,IRequiresSession但它没有用.有人能帮我吗?
似乎一些Web架构师的目标是拥有一个无状态的Web应用程序.这是否意味着基本上不存储用户会话?或者还有更多吗?
如果只是存储用户会话,那么不这样做有什么好处?
由于HTTP是无状态协议,当客户端向服务器发出大量请求时,服务器如何在一段时间内唯一地标识特定客户端的请求,例如t1,t2,t3 ..
我浏览了网页,遇到了会话ID,网址重写和Cookie等术语.但如果有人以更好的方式解释它会很棒.具体而言,HTTP请求和响应的哪一部分将用于会话跟踪?
我遇到过ASP会话的好奇行为.您可以强制控制器在用户会话之外 - 我希望能够执行此操作,以便可以同时执行多个请求并使用会话使它们连续执行.
禁用会话状态按预期工作:
[SessionState(SessionStateBehavior.Disabled)]
public class SampleController : Controller
{
public ActionResult Test()
{
// Access to the session should be denied
object test = Session["test"];
return Content(test);
}
}
Run Code Online (Sandbox Code Playgroud)
转到〜/ Sample/Test会抛出一个System.Web.HttpException,如预期的那样.但是,只读会话似乎有点奇怪:
[SessionState(SessionStateBehavior.ReadOnly)]
public class SampleController : Controller
{
public ActionResult Test()
{
// Read from the session should be fine
object test = Session["test"];
return Content(test);
}
public ActionResult SetTest(string value)
{
// Write to the session should fail
Session["test"] = value;
// Read …Run Code Online (Sandbox Code Playgroud) 由于对我们的一些产品进行了渗透测试,当时看起来很容易解决的"容易"问题变得非常棘手.
当然不应该这样,我的意思是,为什么只为当前HTTPContext这个难以产生一个全新的会话?离奇!无论如何 - 我写了一个厚脸皮的小实用工具类来"做它":
(代码格式化/突出显示/ Visual Basic道歉我必须做错事)
Imports System.Web
Imports System.Web.SessionState
Public Class SwitchSession
Public Shared Sub SetNewSession(ByVal context As HttpContext)
' This value will hold the ID managers action to creating a response cookie
Dim cookieAdded As Boolean
' We use the current session state as a template
Dim state As HttpSessionState = context.Session
' We use the default ID manager to generate a new session id
Dim idManager As New SessionIDManager() …Run Code Online (Sandbox Code Playgroud) 第二个不能保存对会话变量的更改的区别IRequiresSessionState和IReadOnlySessionState旁边有什么区别?
两者都为我提供了访问我的会话变量的能力HttpHandler.但为什么我更喜欢IReadOnlySessionState?它只是限制我保存下一个请求的会话.
或者它是否给我带来了性能优势IRequiresSessionState?
什么时候我宁愿用IReadOnlySessionState了IRequiresSessionState?
在web.config中,我将sessionState中的超时设置为20分钟.根据MSDN,此超时指定会话在被放弃之前可以空闲的分钟数.在IIS 7中,DefaultWebSite->会话状态 - > Cookie设置 - >超时自动填充web.config中设置的超时值,在我的情况下是20分钟.此外,应用程序池 - > DefaultAppPool->高级设置 - > idleTimeout,我将其设置为10分钟.
然后我做了两个测试:第一次测试:我在下午3:45登录我的网络应用程序,闲置10分钟.下午3:55,我试图使用我的应用程序,我被踢了出去.我认为idleTimeout正在发挥作用.
第二次测试:我在下午4:00登录我的网络应用程序,在下午4:05,下午4:10,下午4:15和下午4:20使用应用程序.我预计会在下午4:20被踢出局.但我不是.我认为IIS 7中的会话状态超时(20分钟)是Web Agent挑战用户重新进行身份验证之前用户会话可以处于活动状态的最长时间.显然,从这个测试,它不是.任何人都可以向我解释一下吗?另外,我如何设置上述情况的超时?
session-state ×10
asp.net ×4
session ×3
asp.net-mvc ×2
c# ×2
android ×1
http ×1
http-headers ×1
httphandler ×1
httpsession ×1
iis-7 ×1
rest ×1
sessionid ×1
signalr ×1
signalr-hub ×1
stateless ×1
timeout ×1