草庐IT

asp.net-mvc - Microsoft.Web.RedisSessionStateProvider 不保存值

coder 2023-11-07 原文

问题

未在 Razor View 中检索 session 值并导致逻辑错误。

环境

Redis sentinel 和 web 服务器上的 sentinel 但只有一个 redis master 和一个 redis slave。 redis 连接字符串同时指向主从。

代码

在 View 之前的 Controller 中:

var fooLocal = fooMapper.Map(fooDbCall.GetFromDb(fooValue));

if (fooLocal != null)
{
    Session["FooSession"] = fooLocal.fooProperty;
}
else
{
    Session["FooSession"] = false;
}

在 View 中

@if (fooRazorVal == 123)
{
    // show some stuff
}
else if (!((bool?)Session["FooSession"] ?? false) && (fooRazorVal2 == 456))
{
    // show error message
}
else
{
    // show other stuff
}

结果

即使已通过代码和数据库回溯有问题的帐户以验证它不应为假,更不用说为空,也会显示错误消息。其他 session 值的存储和检索都很好,否则您甚至不会在我的流程中做到这一点。

调查

正如我提到的,所有其他代码位和数据库都已经过验证。我添加了一个日志记录类,并且有很多这样的条目:

[Info]GetItemFromSessionStore => Session Id: ctps3urcqwm0tpezo5bbmqzj, Session provider object: 4686063 => Can not lock, Someone else has lock and lockId is 636901606595110722
[Info]GetItemFromSessionStore => Session Id: ctps3urcqwm0tpezo5bbmqzj, Session provider object: 26422156 => Lock taken with lockId: 636901606595110722
[Info]GetItemFromSessionStore => Session Id: ctps3urcqwm0tpezo5bbmqzj, Session provider object: 4686063 => Can not lock, Someone else has lock and lockId is 636901606595110722

但是,考虑到它们的绝对数量,我想知道这实际上是一个错误还是 RedisSessionStateProvider 按预期工作。我确实看到它使用 SETNX 来获取锁。不幸的是,我对 Redis 语义不够精通,不知道这是否会导致问题。

我在 Redis 文档上做了 see a note,关于这是一种旧方法并改用 RedLock。然而,据我了解 RedLock,单个主/单个从设置是不够的,尽管它支持重试,所以它可能无论如何都可以工作。我也很好奇我是否应该推出一个简单的自定义提供程序,让 StackExhange 的 ConnectionMultiplexer 在没有额外锁或自定义脚本的情况下工作,以及我是否确实需要锁才能使用 RedLock 的 C# 库之一。

最佳答案

根据设计,Redis 键在更新期间被锁定,您不需要锁定它们。事实上,Redis 使用单线程来处理命令,因此每个操作都是原子的。其他客户端在给定命令的处理过程中被阻塞,这就是为什么您不能执行执行时间很长的查询并且会收到此错误的原因。

要防止必须实现分布式锁。在不同进程必须以互斥方式使用共享资源的许多环境中,分布式锁是一种非常有用的原语。

这里是不同语言的不同实现。

实现

这里有一些指向已经可用的实现的链接,可供引用。

Redlock-rb ( ruby 实现)。还有一个 Redlock-rb 的分支,它添加了一个 gem 以便于分发,也许还有更多。

Redlock-py (Python 实现)。

Aioredlock (Asyncio Python 实现)。

Redlock-php (PHP implementation).

PHPRedisMutex (further PHP implementation)

Redsync.go (Go implementation).

Redisson (Java implementation).

Redis::DistLock (Perl implementation).

Redlock-cpp (C++ implementation).

Redlock-cs (C#/.NET 实现)。

RedLock.net (C#/.NET 实现)。包括异步和锁定扩展支持。

ScarletLock (C# .NET implementation with configurable datastore)

node-redlock (NodeJS implementation). Includes support for lock extension.

看看这是否有帮助。

关于asp.net-mvc - Microsoft.Web.RedisSessionStateProvider 不保存值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55577365/

有关asp.net-mvc - Microsoft.Web.RedisSessionStateProvider 不保存值的更多相关文章

  1. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  2. ruby - 如何模拟 Net::HTTP::Post? - 2

    是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

  3. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

    我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

  4. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

  5. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  6. .net - .NET 将如何影响 Python 和 Ruby 应用程序? - 2

    我很好奇.NET将如何影响Python和Ruby应用程序。用IronPython/IronRuby编写的应用程序是否会非常特定于.NET环境,以至于它们实际上将变得特定于平台?如果他们不使用任何.NET功能,那么IronPython/IronRuby相对于非.NET同类产品的优势是什么? 最佳答案 我不能说任何关于IronRuby的东西,但是大多数Python实现(如IronPython、Jython和PyPy)都试图尽可能忠实于CPython实现。不过,IronPython正在迅速成为这方面的佼佼者之一,并且在PlanetPyth

  7. ruby-on-rails - 有没有一种工具可以在编码时自动保存对文件的增量更改? - 2

    我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功

  8. ruby - 在 ASP 页面上 Mechanize 中断 - 2

    require'mechanize'agent=Mechanize.newlogin=agent.get('http://www.schoolnet.ch/DE/HomeDE.htm')agent.clicklogin.link_withtext:/Login/然后我得到Mechanize::UnsupportedSchemeError。 最佳答案 Mechanize不支持javascript但您可以将搜索字段添加到表单并为其分配搜索词并使用mechanize提交表单form=page.forms.firstform.add_fie

  9. ruby-on-rails - Rails 3.2 防止使用错误保存对象 - 2

    我有一个ActiveRecord对象,我想在不对模型进行永久验证的情况下阻止它被保存。您过去可以使用errors.add执行类似的操作,但它看起来不再有效了。user=User.lastuser.errors.add:name,"namedoesn'trhymewithorange"user.valid?#=>trueuser.save#=>true或user=User.lastuser.errors.add:base,"myuniqueerror"user.valid?#=>trueuser.save#=>true如何在不修改用户对象模型的情况下防止将用户对象保存在Rails3.2中

  10. ruby - 如何配置 Ruby Mechanize 代理以通过 Charles Web 代理工作? - 2

    我正在使用Ruby/Mechanize编写一个“自动填写表格”应用程序。它几乎可以工作。我可以使用精彩CharlesWeb代理以查看服务器和我的Firefox浏览器之间的交换。现在我想使用Charles查看服务器和我的应用程序之间的交换。Charles在端口8888上代理。假设服务器位于https://my.host.com。.一件不起作用的事情是:@agent||=Mechanize.newdo|agent|agent.set_proxy("my.host.com",8888)end这会导致Net::HTTP::Persistent::Error:...lib/net/http/pe

随机推荐