我们子公司的IT部门有一家咨询公司为他们编写了一个ASP.NET应用程序.现在它已经出现间歇性问题,混淆了当前用户是谁,并且已经知道他错误地向Joe展示了一些Bob的数据.
顾问们被带回来进行故障排除,我们被邀请听取他们的解释.突然发生了两件事.
首先,顾问主管提供了这个伪代码:
void MyFunction()
{
Session["UserID"] = SomeProprietarySessionManagementLookup();
Response.Redirect("SomeOtherPage.aspx");
}
Run Code Online (Sandbox Code Playgroud)
他继续说会话变量的赋值是异步的,这似乎是不真实的.对查询函数的调用可以异步执行某些操作,但这似乎是不明智的.
鉴于所谓的异步性,他的理论是在重定向不可避免的ThreadAbort异常被引发之前没有分配会话变量.然后,此故障阻止SomeOtherPage显示正确的用户数据.
其次,他举了一个他推荐的编码最佳实践的例子.而不是写:
int MyFunction(int x, int x)
{
try
{
return x / y;
}
catch(Exception ex)
{
// log it
throw;
}
}
Run Code Online (Sandbox Code Playgroud)
他推荐的技术是:
int MyFunction(int x, int y, out bool isSuccessful)
{
isSuccessful = false;
if (y == 0)
return 0;
isSuccessful = true;
return x / y;
}
Run Code Online (Sandbox Code Playgroud)
这肯定会起作用,并且在某些情况下从性能角度来看可能更好.
但是,从这些和其他讨论点来看,我们认为这个团队在技术上并不精通.
意见?
而不是做
session("myvar1") = something
session("myvar2") = something
session("myvar3") = something
session("myvar4") = something
Run Code Online (Sandbox Code Playgroud)
是在做
enum sessionVar
myvar1
myvar2
myvar3
myvar4
end enum
session(sessionVar.myvar1.tostring) = something
session(sessionVar.myvar2.tostring) = something
session(sessionVar.myvar3.tostring) = something
session(sessionVar.myvar4.tostring) = something
Run Code Online (Sandbox Code Playgroud)
会更好?
我想确定用户是否已登录,或者他们是否只是来自javascript的匿名...
我发现了这个问题,但它是php代码,我不确定是否有一个名为logged_in的会话变量存储在登录中,或者这只是那个人自己实现的东西.
任何人都知道如何检查用户是否从javascript登录,可能使用ajax?
编辑:我正在运行Asp.Net MVC,抱歉应该已经指定了
这样我就可以实现客户端ajax登录.当页面加载时,我需要知道用户是否登录,因此我可以<asp:LoggedInView>使用jquery 实现类似于控件的操作.
谢谢,
马特
注意:我知道避免使用会话的各种原因,但这是我继承的项目,所以请跳过任何回复的那部分:)
由于这是一个已解决的问题,我希望有人可以指向ELMAH补丁/分支/分支,其中包括记录会话数据而不是重新发明轮子.
一个奇怪的事情是来自Atif的旧帖子说他们已经记录了:
http://markmail.org/message/ncmdgwm5rmzewbwu
评论者henningst提到在这里添加会话变量:
http://www.hanselman.com/blog/ELMAHErrorLoggingModulesAndHandlersForASPNETAndMVCToo.aspx
另一种方法(我宁愿避免)是将值复制到cookie中
我知道一种替代方法是转换到ELMAH之外的东西(比如Exceptioneer - 请参阅http://exceptioneer.com/Public/ExceptioneerAndELMAH.aspx),但由于这是我目前ELMAH的唯一问题,我宁愿只有一个修补ELMAH而不是切换到别的东西.
我有一个为SharePoint 2007构建的Web服务,我正在尝试移植到SharePoint 2010.此Web服务依赖于会话状态才能正常运行,但到目前为止,我已启用会话状态在SharePoint 2010中工作这个Web服务在/_vti_bin虚拟目录下作为自己的Web应用程序运行.我没有运气就尝试了以下所有方法:
System.Web.SessionState.SessionStateModulehttp模块添加到我的应用程序的web.config文件中.System.Web.SessionState.SessionStateModulehttp模块添加到我的SharePoint根web.config文件中.<pages enableSessionState="true" />到我的应用程序的web.config文件中.<pages enableSessionState="true" />到我的根web.config文件中.其他环境信息:
有没有人有幸运行Web应用程序或 Web服务以在SharePoint 2010中使用会话状态?
谢谢!
史蒂夫
质询
细节
我正在使用
该脚本使用异步ajax请求多次获取和设置joomla变量.我在会话中存储的数据是一个数组.间歇性地,一些阵列数据丢失了.一旦用户登录并使用脚本,它似乎会更加一致.
说实话,我不确定问题是什么,但我开始认为我的代码正在遭遇竞争条件.我认为Joomla可能会在完成编写之前尝试读取会话信息,或者只是没有设置.缺失的信息似乎是随机选择的,并且间歇性地发生数据丢失.
SCRIPT1
脚本1使用异步ajax请求来获取/设置Joomla会话变量.这将被多次调用.由于设计原因,在ajax响应成功之前,不能再次调用脚本1.
$.ajax(
{ cache:false,
url: 'script2.php',
data: { 'change': change},
dataType: 'json',
success: function(data)
{
//do something
}
});
Run Code Online (Sandbox Code Playgroud)
这是我在脚本2中用来访问Joomla和获取/设置会话数据的代码的粗略概念.
SCRIPT2
<?php
//some code omitted for brevity
$app = &JFactory::getApplication('site');/
$app->initialise();
$nottimedout=false;
$session = JFactory::getSession();
$jquizstart = date( 'Y-m-d H:i:s', time() ); //<<-- time of access
$nottimedout = $session->has('jtimedout');
if ($nottimedout==true)
{
$jqid = $session->get('jqid'); //<<-- get array …Run Code Online (Sandbox Code Playgroud) 我试图使用一个会话,但当我需要值返回其null?
我的网站以登录开始,我将用户名放入会话.
Session["userName"] = login.UserName;
Run Code Online (Sandbox Code Playgroud)
然后该网站被重定向到新页面.
return RedirectToAction("Choice", new { token = token });
Run Code Online (Sandbox Code Playgroud)
巫婆之后我使用链接移动到我的下一页.
@Html.ActionLink("Download", "Download", new {token = Model.Token})
Run Code Online (Sandbox Code Playgroud)
我将我的代码指向家庭控制器中的动作结果,同一个控制器我有我的登录功能.
@Html.ActionLink("Download", "DownloadFile", new { fileid = item.Key, token = Model.Token, platform = "windows", filename = item.Value }, new {@class = "DownloadLink" } )
Run Code Online (Sandbox Code Playgroud)
我尝试再次调用我的会话值.
formMobiApi.GetFile(token, fileid, platform, filename, Session["userName"].ToString(), tasks, taskId, spreadSheetStatus);
Run Code Online (Sandbox Code Playgroud)
这些操作中的任何一个是否都可以使我的会话值为null?
我可以使用这样的会话吗?
细节
我可以使用用户状态变量来存储和检索Joomla会话中的数据.
示例设置变量
$app =& JFactory::getApplication();
$app->setUserState( 'myvar', $myvarvalue );
Run Code Online (Sandbox Code Playgroud)
但我也可以使用JFactory/getSession在会话中存储和检索变量.
示例设置变量
$session =& JFactory::getSession();
$session->set('myvar', $myvarvalue);
Run Code Online (Sandbox Code Playgroud)
问题
这两种方法有什么区别?我什么时候应该使用另一个?
我有一个在OWIN进程中托管的示例Web API(自托管,而不是在IIS中).我在我的控制器中获得了一个JWT令牌,我希望能够在应用程序的另一部分中进行检索,这是一个实现NserviceBus IMutateOutgoingTransportMessages的类.在我的其他Web应用程序POC(在IIS中托管)中,我使用了一个简单的会话变量,它工作得很好.但我想知道在我的新OWIN自托管环境中最好的方法是什么?静态类中的静态属性?
如何在 ASP.NET Core 3 中的两台服务器之间共享会话(负载平衡)?会话可以在多个 Web 服务/API 和主 ASP.NET MVC 应用程序之间共享吗?
我对 .NET Core 3 非常陌生,我习惯于在 ASP.NET Framework MVC 中使用会话状态(它就像在站点的 IIS 配置中使用相同的机器密钥一样简单),但我已经了解到.NET Core 3 的一切都发生了变化,此外,随着新版本的推出,许多文档都非常过时/过时,.NET Core 1 与更高版本无关,2 与 3 无关,而且它需要许多 NuGet 包可能会或可能不会再工作。
目前我已经成功地使用 .NET Core 3 实现了 SQL 会话存储,但是机器密钥的选项不再出现在 IIS 中,我真的不知道如何在appsettings.json文件中配置它们(如果仍然使用的话)。
我们的设置是 2 个服务器,它们必须共享会话信息,使用 F5 负载平衡器,我们使用 .NET Framework MVC 的旧应用程序配置如下,我需要帮助来实现相同的结果,但使用 .NET Core 3。
我通读了https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/web-farm?view=aspnetcore-3.1但它并没有真正解释如何实际做任何事情
还有这个https://docs.microsoft.com/en-us/aspnet/core/performance/caching/distributed?view=aspnetcore-3.1帮助配置了 SQL 会话存储,但不是如何在两台服务器之间共享
c# session-variables session-state sql-session-state .net-core-3.0