问题描述
我正在尝试将ASP.NET会话状态存储在缓存中(用于Redis的Azure缓存),如此处https://docs.microsoft.com/en-us/azure/azure-cache-for-redis/cache-aspnet-session-state-provider
所述但是,我收到以下错误消息。
mydomain.redis.cache.windows.net:6379/Interactive上的UnabletoConnect, 原点:ResetNonConnected,输入缓冲区:0,未完成:0,最后读取: 5s之前,最后写入:5s之前,未答复写入:1106595s之前, 保持活动状态:60秒钟,待处理状态:0,状态:正在连接,最后一次心跳:从不, last-mbeat:-1s之前,global:5s之前,mgr:无效,err:永不 StackExchange.Redis.RedisConnectionException:无法连接 mydomain.redis.cache.windows.net:6379/Interactive,来源: ResetNonConnected,输入缓冲区:0,未完成:0,最后读取:5秒钟前, 上次写入:5s前,未答复写入:1106595s前,保持活动状态:60s, 待定:0,状态:正在连接,最后一次心跳:从不,最后一次心跳:-1秒 前,全球:5年前,mgr:不活跃,错误:从不
<add name="AzureRedisCacheConnection" connectionString="mydomain.redis.cache.windows.net:6379,password=password=,ssl=False,abortConnect=False"/>
</connectionStrings>
<sessionState mode="Custom" customProvider="AzureCacheForRedisProvider">
<providers>
<!-- For more details check https://github.com/Azure/aspnet-redis-providers/wiki -->
<!-- Either use 'connectionString' OR 'settingsClassName' and 'settingsMethodName' OR use 'host','port','accessKey','ssl','connectionTimeoutInMilliseconds' and 'operationTimeoutInMilliseconds'. -->
<!-- 'throwOnError','retryTimeoutInMilliseconds','databaseId' and 'applicationName' can be used with both options. -->
<!--
<add name="AzureCacheForRedisProvider"
host = "127.0.0.1" [String]
port = "" [number]
accessKey = "" [String]
ssl = "false" [true|false]
throwOnError = "true" [true|false]
retryTimeoutInMilliseconds = "5000" [number]
databaseId = "0" [number]
applicationName = "" [String]
connectionTimeoutInMilliseconds = "5000" [number]
operationTimeoutInMilliseconds = "1000" [number]
connectionString = "<Valid StackExchange.Redis connection string>" [String]
settingsClassName = "<Assembly qualified class name that contains settings method specified below. Which basically return 'connectionString' value>" [String]
settingsMethodName = "<Settings method should be defined in settingsClass. It should be public,static,does not take any parameters and should have a return type of 'String',which is basically 'connectionString' value.>" [String]
loggingClassName = "<Assembly qualified class name that contains logging method specified below>" [String]
loggingMethodName = "<Logging method should be defined in loggingClass. It should be public,does not take any parameters and should have a return type of System.IO.TextWriter.>" [String]
redisSerializerType = "<Assembly qualified class name that implements Microsoft.Web.Redis.ISerializer>" [String]
/>
-->
<add name="AzureCacheForRedisProvider" type="Microsoft.Web.Redis.RedisSessionStateProvider"
connectionString="AzureRedisCacheConnection"
/>
</providers>
</sessionState> ````
What am I missing here?
解决方法
我已经阅读了官方文档,并且对我有用。
如果要支持6379
,则需要设置Allow access only via SSL=No
。
我也找到了这些官方博客,我认为这对您有用。
Announcing ASP.NET Session State Provider for Redis Preview Release
我的web.config
文件中的内容。
<sessionState mode="Custom" customProvider="MySessionStateStore">
<providers>
<!-- For more details check https://github.com/Azure/aspnet-redis-providers/wiki -->
<!-- Either use 'connectionString' OR 'settingsClassName' and 'settingsMethodName' OR use 'host','port','accessKey','ssl','connectionTimeoutInMilliseconds' and 'operationTimeoutInMilliseconds'. -->
<!-- 'throwOnError','retryTimeoutInMilliseconds','databaseId' and 'applicationName' can be used with both options. -->
<!--
<add name="MySessionStateStore"
host = "127.0.0.1" [String]
port = "" [number]
accessKey = "" [String]
ssl = "false" [true|false]
throwOnError = "true" [true|false]
retryTimeoutInMilliseconds = "5000" [number]
databaseId = "0" [number]
applicationName = "" [String]
connectionTimeoutInMilliseconds = "5000" [number]
operationTimeoutInMilliseconds = "1000" [number]
connectionString = "<Valid StackExchange.Redis connection string>" [String]
settingsClassName = "<Assembly qualified class name that contains settings method specified below. Which basically return 'connectionString' value>" [String]
settingsMethodName = "<Settings method should be defined in settingsClass. It should be public,static,does not take any parameters and should have a return type of 'String',which is basically 'connectionString' value.>" [String]
loggingClassName = "<Assembly qualified class name that contains logging method specified below>" [String]
loggingMethodName = "<Logging method should be defined in loggingClass. It should be public,does not take any parameters and should have a return type of System.IO.TextWriter.>" [String]
redisSerializerType = "<Assembly qualified class name that implements Microsoft.Web.Redis.ISerializer>" [String]
/>
-->
<add name="MySessionStateStore" type="Microsoft.Web.Redis.RedisSessionStateProvider" host="jasonp2rediscache.redis.cache.windows.net:6380" accessKey="kKtOl***kLPg=" ssl="true" />
</providers>
</sessionState>
我的测试步骤。
步骤1。在登录方法中添加Session["loginTime"]
。
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model,string returnUrl)
{
if (!ModelState.IsValid)
{
return View(model);
}
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout,change to shouldLockout: true
var result = await SignInManager.PasswordSignInAsync(model.Email,model.Password,model.RememberMe,shouldLockout: false);
switch (result)
{
case SignInStatus.Success:
Session["loginTime"] = DateTime.Now.ToString();// Add this line
Session["webapp"] = "mywebapp";// Add this line
return RedirectToLocal(returnUrl);
case SignInStatus.LockedOut:
return View("Lockout");
case SignInStatus.RequiresVerification:
return RedirectToAction("SendCode",new { ReturnUrl = returnUrl,RememberMe = model.RememberMe });
case SignInStatus.Failure:
default:
ModelState.AddModelError("","Invalid login attempt.");
return View(model);
}
}
步骤2.通过redsmin连接您的Redis缓存。 (https://app.redsmin.com/)
我已经在该网站注册以检查价值。
第3步。运行项目。
第4步。检查键和Redsmin中的值。