Git Product home page Git Product logo

aspnet-redis-providers's Introduction

This project has adopted the Microsoft Open Source Code of Conduct. For more information see the Code of Conduct FAQ or contact [email protected] with any additional questions or comments.

ASP.NET Redis Providers

This repository contains code for Session State and Output Cache providers for Redis.

  1. Azure Redis Session State Provider can be use to store your session state in a Redis Cache rather than in-memory or in a SQL Server database.
  2. Azure Redis Output Cache Provider is an out-of-process storage mechanism for output cache data. This data is specifically for full HTTP responses (page output caching).
  3. Azure Redis Output Cache Middleware contains an extensible middleware project described in the docs which provides output caching for ASP.NET Core 3.1 - 6.0.

Documentation

See Azure Redis Session State Provider Documentation and Azure Redis Output Cache Provider Documentation

License

This project is licensed under the MIT License

Build and Test

Open Microsoft.CacheProviders.sln with Visual Studio. You should install xUnit.net runner for Visual Studio in visual studio using "TOOLS -> Extensions and Updates..." Right click on solution in "Solution Explorer" and click on "Build Solution" in visual studio to build all projects. Open "Test Explorer" in visual studio and run all tests by clicking on "Run All".

Release Notes

Release Notes

Questions?

aspnet-redis-providers's People

Contributors

andreymir avatar brendankowitz avatar damirainullin avatar daniel-liuzzi avatar dvinales avatar hiimoscarin avatar jbparker avatar joncole avatar jongalloway avatar mapalan avatar microsoft-github-policy-service[bot] avatar philon-msft avatar robertmiles3 avatar siddharthchatrolams avatar slorello89 avatar stanleysmall-microsoft avatar steved0x avatar teonivalois avatar thepirat000 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

aspnet-redis-providers's Issues

SerializationException: The ObjectManager found an invalid number of fixups.

[SerializationException: The ObjectManager found an invalid number of fixups. This usually indicates a problem in the Formatter.]

[SerializationException: The ObjectManager found an invalid number of fixups. This usually indicates a problem in the Formatter.]
System.Runtime.Serialization.ObjectManager.DoFixups() +14053613
System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage) +194
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage) +285
Microsoft.Web.Redis.BinarySerializer.Deserialize(Byte[] data) in d:\TeamCityBuildAgent\work\f55792526e6d9089\src\Shared\BinarySerializer.cs:39
Microsoft.Web.Redis.StackExchangeClientConnection.GetSessionData(Object rowDataFromRedis) in d:\TeamCityBuildAgent\work\f55792526e6d9089\src\Shared\StackExchangeClientConnection.cs:235
Microsoft.Web.Redis.RedisConnectionWrapper.TryTakeWriteLockAndGetData(DateTime lockTime, Int32 lockTimeout, Object& lockId, ISessionStateItemCollection& data, Int32& sessionTimeout) in d:\TeamCityBuildAgent\work\f55792526e6d9089\src\RedisSessionStateProvider\RedisConnectionWrapper.cs:196
Microsoft.Web.Redis.RedisSessionStateProvider.GetItemFromSessionStore(Boolean isWriteLockRequired, HttpContext context, String id, Boolean& locked, TimeSpan& lockAge, Object& lockId, SessionStateActions& actions) in d:\TeamCityBuildAgent\work\f55792526e6d9089\src\RedisSessionStateProvider\RedisSessionStateProvider.cs:276
Microsoft.Web.Redis.RedisSessionStateProvider.GetItemExclusive(HttpContext context, String id, Boolean& locked, TimeSpan& lockAge, Object& lockId, SessionStateActions& actions) in d:\TeamCityBuildAgent\work\f55792526e6d9089\src\RedisSessionStateProvider\RedisSessionStateProvider.cs:190
System.Web.SessionState.SessionStateModule.GetSessionStateItem() +176
System.Web.SessionState.SessionStateModule.BeginAcquireState(Object source, EventArgs e, AsyncCallback cb, Object extraData) +980
System.Web.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +636
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +137

Does anyone know what this means? Is it a limitation with the way serialization works?

How to write redis connectstring in c# code?

<add name="MySessionStateStore"
host = "127.0.0.1" [String]
port = "" [number]
accessKey = "" [String]
ssl = "false" [true|false]
throwOnError = "true" [true|false]
retryTimeoutInMilliseconds = "0" [number]
databaseId = "0" [number]
applicationName = "" [String]
connectionTimeoutInMilliseconds = "5000" [number]
operationTimeoutInMilliseconds = "5000" [number]

.....

How to write redis connectstring in c# code?

No way to truly disable session state for ApiController? SessionStateModule.BeginAcquireState is still called!

Session state supposedly is disabled by default in MVC ApiController, indeed HttpContext.Current.Session is null, however in load testing I'm seeing these exceptions, which are expected, however they occur for requests that are on the API controller, seems to me BeginAcquireState should never even be called.

This is caught in Application_Error where the current request shows it's an ApiController request.

Seems that session state is only half disabled for ApiControllers and sliding expiration updates still occur? Will [SessionState(System.Web.SessionState.SessionStateBehavior.Disabled)] disable it fully?

Exception : System.TimeoutException: Timeout performing EVAL, inst: 0, mgr: Inactive, err: never, queue: 0, qu: 0, qs: 0, qc: 0, wr: 0, wq: 0, in: 0, ar: 0, clientName: Teleport.WebUX_IN_0, serverEndpoint: Unspecified/testing.redis.cache.windows.net:6380, keyHashSlot: 3266, IOCP: (Busy=1,Free=999,Min=50,Max=1000), WORKER: (Busy=42,Free=32725,Min=50,Max=32767), Local-CPU: 100% (Please take a look at this article for some common client-side issues that can cause timeouts: https://github.com/StackExchange/StackExchange.Redis/tree/master/Docs/Timeouts.md) at StackExchange.Redis.ConnectionMultiplexer.ExecuteSyncImpl[T](Message message, ResultProcessor1 processor, ServerEndPoint server) at StackExchange.Redis.RedisBase.ExecuteSync[T](Message message, ResultProcessor1 processor, ServerEndPoint server) at StackExchange.Redis.RedisDatabase.ScriptEvaluate(String script, RedisKey[] keys, RedisValue[] values, CommandFlags flags) at Microsoft.Web.Redis.StackExchangeClientConnection.<>c__DisplayClass4.b__3() in d:\TeamCityBuildAgent\work\f55792526e6d9089\src\Shared\StackExchangeClientConnection.cs:line 119 at Microsoft.Web.Redis.StackExchangeClientConnection.RetryForScriptNotFound(Func1 redisOperation) in d:\TeamCityBuildAgent\work\f55792526e6d9089\src\Shared\StackExchangeClientConnection.cs:line 137 at Microsoft.Web.Redis.StackExchangeClientConnection.RetryLogic(Func1 redisOperation) in d:\TeamCityBuildAgent\work\f55792526e6d9089\src\Shared\StackExchangeClientConnection.cs:line 161 at Microsoft.Web.Redis.StackExchangeClientConnection.Eval(String script, String[] keyArgs, Object[] valueArgs) in d:\TeamCityBuildAgent\work\f55792526e6d9089\src\Shared\StackExchangeClientConnection.cs:line 119 at Microsoft.Web.Redis.RedisConnectionWrapper.UpdateExpiryTime(Int32 timeToExpireInSeconds) in d:\TeamCityBuildAgent\work\f55792526e6d9089\src\RedisSessionStateProvider\RedisConnectionWrapper.cs:line 90 at Microsoft.Web.Redis.RedisSessionStateProvider.ResetItemTimeout(HttpContext context, String id) in d:\TeamCityBuildAgent\work\f55792526e6d9089\src\RedisSessionStateProvider\RedisSessionStateProvider.cs:line 298 at System.Web.SessionState.SessionStateModule.BeginAcquireState(Object source, EventArgs e, AsyncCallback cb, Object extraData) at System.Web.HttpApplication.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) TraceSource="w3wp.exe"

Could not load file or assembly 'StackExchange.Redis.StrongName, Version=1.2.1.0

I'm using Microsoft.Web.RedisSessionStateProvider.2.2.4 and is dependent on StackExchange.Redis.StrongName - 1.1.608, this dependency is installed with nuget, But when I run my application its trying to use StackExchange.Redis.StrongName - 1.2.1.0.

Any suggestion?

Could not load file or assembly 'StackExchange.Redis.StrongName, Version=1.2.1.0, Culture=neutral, PublicKeyToken=c219ff1ca8c2ce46' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.IO.FileLoadException: Could not load file or assembly 'StackExchange.Redis.StrongName, Version=1.2.1.0, Culture=neutral, PublicKeyToken=c219ff1ca8c2ce46' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

Support multiple instances of RedisSessionStateProvider in an application

We'd like to have two instances of the RedisSessionStateProvider, so that we can place a replicating session state provider over the top. We want to push writes through both providers and read from the primary. The reason for this is to maintain session state caches in two Azure data centers, so that when we flip front-ends between data centers customer's sessions aren't broken.
This currently isn't possible because the configuration object is static and therefore shared between all instances of the session provider.
Is there any reason why multiple providers couldn't be supported? Or is there a better way to support our use case?

Shared connection or connection string

Background
I have a web app that I am refactoring to use Redis session state. I also have some other application state that I would like to use Redis for, and have created a basic implementation using StackExchange.Redis client. I am also using a Sentinel-based architecture to provide master-slave failover, so there are multiple hosts listed in the connection string.

Problem
I don't want to have to define the connection string in two places, I want to get hold of either the connection string from the Redis session state provider, or maybe even better, get hold of the underlying Redis connection.
I notice the OutputCache provider does not have a ConnectionString configuration property, so is that not inconsistent with the Session state provider?

Workarounds?
Read the session state provider config to obtain the connectionstring value.
I don't think this is a particularly great solution.

Possible solutions?
a) the provider exposes a public method to get the underlying StackExchange.Redis connection
b) the provider has an additional configuration attribute (eg connectionStringName), which is the name of a connection string in the usual configuration element.

varyByParam="None" not work

When I add varyByParam = "None" in outputCacheProfiles the outputcache does not ignore the parameters that are added in the url, the redis cache stores another record.

This solution is not working for multi server setup in AWS behind Load balancer

I'm facing problem when I tried to use redis as session session server for the below configuration:

  1. Two windows servers hosting same application
  2. Elastic load balancer with weighted routing redirects requests to the 2 IIS servers
  3. Redis is hosted in AWS elastic-cache and accessible from both servers
  4. Redis serves as a session server for 1 server at a time without any issue

for each session 3 keys are created
"{/_kktffpxxxxxxg2xixdnhe}_Write_Lock"
"{/_kktffpxxxxxxg2xixdnhe}_Data"
"{/_kktffpxxxxxxg2xixdnhe}_Internal"

Issue: When 1+ servers try to serve same user, by accessing session from redis at same instance, if 1 server have placed "_Write_Lock" then the other server fails to write the data and after that it cleares the key --> result, the user's next request to any server fails to verify his/her session.

Am i the only one who gets this issue ??

Note: With session stickiness enabled in ELB the signout is not intermittent, however that restricts us to take out a server for upgradation without loosing all user sessions for that server.

defaultDatabase is no use?

hi, i have a problem with [connectionString] , i think [defaultDatabase ] attribute in [connectionString] is no use, aspnet-redis-providers still use [databaseId] to read the database.

How to use: HttpResponse.RemoveOutputCacheItem when using varyByCustom

LS,

I have implemented the Redis OutputCache using the Azure Redis service.

On top of the pages need to cache:
<%@ OutputCache VaryByParam="*" Duration="600" %>

After access a random page and I check the key in Redis database is has saved like:
/_a2/monitor.aspxHQNactionVtestFCDE

So running the below line of code, will remove this cache item (and it worked).
HttpResponse.RemoveOutputCacheItem("/monitor.aspx?action=test", "RedisOutputCache")

Now I have updated the same page adding the varyByCustom the the OutputCache directive:
<%@ OutputCache VaryByParam="*" varyByCustom="userhash" Duration="600" %>

Now accessing the page and checking the key in Redis database it is saved like:
/_a2/monitor.aspxHQNactionVtestFCNuserhashVcc6ef5b7173286704cef942d5577b88bd81f2cce71a0dcdc8676d3a815e68b59DE

You see the added userhash hash value, this is nice and worked as axpected.
But now here comes the problem: How do I clear this cache item.

This is not working:
HttpResponse.RemoveOutputCacheItem("/monitor.aspx?action=test", "RedisOutputCache")

Also tried:
HttpResponse.RemoveOutputCacheItem("/monitor.aspx?action=test&userhash=cc6ef5b7173286704cef942d5577b88bd81f2cce71a0dcdc8676d3a815e68b59", "RedisOutputCache")

And also tried:
HttpResponse.RemoveOutputCacheItem("/monitor.aspx?action=test {userhash:cc6ef5b7173286704cef942d5577b88bd81f2cce71a0dcdc8676d3a815e68b59}", "RedisOutputCache")

Is there an way to remove this cache item on using the varyByCustom option?

Any help is most welcome!

Joël

Session.Abandon() does not close underlying connection to redis

I have an web app where terminal-sharing is a common case. When i user logs out I HttpSession.Abandon(), but the underlying connection to redis does not close, so when another user logs in, another connection get's up... and if the previous user gets back, the connection is not re-used, and yet another one is freshly provided...

RedisServerException: READONLY You can't write against a read only slave.

I get the above error occasionally in my all environments.

I have to restart the site whenever this happens. I check my redis nodes and they did not elect a new master. Has anyone seen this error before?

Exception Message:
ERR Error running script (call to f_71fe2e7962348b06aa8ce3e244cdb3f774b4f549): @user_script:4: @user_script: 4: -READONLY You can't write against a read only slave.

Exception StackTrack:
at StackExchange.Redis.ConnectionMultiplexer.ExecuteSyncImpl[T](Message message, ResultProcessor1 processor, ServerEndPoint server) in c:\TeamCity\buildAgent\work\3ae0647004edff78\StackExchange.Redis\StackExchange\Redis\ConnectionMultiplexer.cs:line 1835 at StackExchange.Redis.RedisBase.ExecuteSync[T](Message message, ResultProcessor1 processor, ServerEndPoint server) in c:\TeamCity\buildAgent\work\3ae0647004edff78\StackExchange.Redis\StackExchange\Redis\RedisBase.cs:line 80
at StackExchange.Redis.RedisDatabase.ScriptEvaluate(String script, RedisKey[] keys, RedisValue[] values, CommandFlags flags) in c:\TeamCity\buildAgent\work\3ae0647004edff78\StackExchange.Redis\StackExchange\Redis\RedisDatabase.cs:line 875
at Microsoft.Web.Redis.StackExchangeClientConnection.<>c__DisplayClass4.b__3() in c:\TeamCity\buildAgent\work\f55792526e6d9089\src\Shared\StackExchangeClientConnection.cs:line 113
at Microsoft.Web.Redis.StackExchangeClientConnection.RetryForScriptNotFound(Func1 redisOperation) in c:\TeamCity\buildAgent\work\f55792526e6d9089\src\Shared\StackExchangeClientConnection.cs:line 131 at Microsoft.Web.Redis.StackExchangeClientConnection.RetryLogic(Func1 redisOperation) in c:\TeamCity\buildAgent\work\f55792526e6d9089\src\Shared\StackExchangeClientConnection.cs:line 155
at Microsoft.Web.Redis.StackExchangeClientConnection.Eval(String script, String[] keyArgs, Object[] valueArgs) in c:\TeamCity\buildAgent\work\f55792526e6d9089\src\Shared\StackExchangeClientConnection.cs:line 113
at Microsoft.Web.Redis.RedisConnectionWrapper.TryTakeWriteLockAndGetData(DateTime lockTime, Int32 lockTimeout, Object& lockId, ISessionStateItemCollection& data, Int32& sessionTimeout) in c:\TeamCity\buildAgent\work\f55792526e6d9089\src\RedisSessionStateProvider\RedisConnectionWrapper.cs:line 182
at Microsoft.Web.Redis.RedisSessionStateProvider.GetItemFromSessionStore(Boolean isWriteLockRequired, HttpContext context, String id, Boolean& locked, TimeSpan& lockAge, Object& lockId, SessionStateActions& actions) in c:\TeamCity\buildAgent\work\f55792526e6d9089\src\RedisSessionStateProvider\RedisSessionStateProvider.cs:line 272
at Microsoft.Web.Redis.RedisSessionStateProvider.GetItemExclusive(HttpContext context, String id, Boolean& locked, TimeSpan& lockAge, Object& lockId, SessionStateActions& actions) in c:\TeamCity\buildAgent\work\f55792526e6d9089\src\RedisSessionStateProvider\RedisSessionStateProvider.cs:line 190
at System.Web.SessionState.SessionStateModule.GetSessionStateItem()
at System.Web.SessionState.SessionStateModule.PollLockedSessionCallback(Object state)

Can not get access to the redis connection due to ProviderConfiguration being internal

Hi,

Redis recommends only having one connection per instance. At the current time there is no way to inject an instance, nor collect the instance created by the session handler. One workaround would be access to the ProviderConfiguration and reuse the try get connection code.

Could you either open this up or give other means of reusing the same connection for an application?

Preferably the ability to inject or presetup the connection so it can be closed on app shutdown as well, as this does not happen today.

Whats the logic for update the Web.config on Updates

I have this in my web.config

    <sessionState mode="Custom" customProvider="SessionStateStore">
      <providers>
        <add port="" applicationName="SigntulSession" name="SessionStateStore" type="Microsoft.Web.Redis.RedisSessionStateProvider" host="localhost" accessKey="" ssl="false" throwOnError="true" />
      </providers>
    </sessionState>

Always when update the NuGet I get the example in my web.config and the app stops working until I deleted

So whats the logic for that and how can avoid this?

Thank you

System.TimeoutException: Timeout performing EVAL, inst: 1, mgr: ExecuteSelect, err: never, queue: 0, qu: 0, qs: 0, qc: 0, wr: 0, wq: 0, in: 0, ar: 0, IOCP: (Busy=0,Free=1000,Min=4,Max=1000), WORKER: (Busy=21,Free=32746,Min=4,Max=32767), clientName

System.TimeoutException: Timeout performing EVAL, inst: 1, mgr: ExecuteSelect, err: never, queue: 0, qu: 0, qs: 0, qc: 0, wr: 0, wq: 0, in: 0, ar: 0, IOCP: (Busy=0,Free=1000,Min=4,Max=1000), WORKER: (Busy=21,Free=32746,Min=4,Max=32767), clientName

AWS Ec2, AWS Redis.

Support for ASP.Net Async SessionState?

Are there any plans to support the release of the ASP.Net Async SessionState? I would love to use the async version of the SessionState provider for Redis!

Thanks

Add App Insights Dependency Tracking

Currently, Redis does not use Dependency Tracking for Application Insights, and we have seen many issues related to Redis timeouts and network latency that would be much easier to debug and see if dependency tracking was built into this provider.

RedisConnectionException that disappeared after app restart

We had the following error, that didn't occur anymore after we restarted the app.

Exception information:
Exception type: RedisConnectionException
Exception message: It was not possible to connect to the redis server(s); to create a disconnected multiplexer, disable AbortOnConnectFail. ConnectTimeout

The app wasn't functioning while we had this error.

Is there a possibility to fallback to InProc until this issue is fixed?

More flexible key naming

Would you be open to me submitting a pull request to allow for a more flexible KeyGenerator? Essentially, I would like to have more flexible key naming that would align with my company's naming convention.

Null reference exceptions if you store objects in the session that require HttpContext.Current in their constructors

Hi all –

We were attempting to place some older classes to the session using this provider and hitting null reference exceptions when our classes would reconstruct during deserialization.

We discovered that:

  1. These classes look for values in HttpContext.Current.Items in their constructors
  2. HttpContext is not thread-safe
  3. Deserialization (and reconstruction) takes place in a new thread where HttpContext.Current is null

The temporary fix:
We noticed thatRedisSessionStateProvider already passes around the "true" HttpContext between its own methods, but never sets the new thread's HttpContext.Current to the passed around reference.

In RedisSessionStateProvider.GetItemFromSessionStore, we set HttpContext.Current = context (context being the reference that's passed in to GetItemFromSessionStore). Our classes can than happily re-instantiate as they find the values where they expect them.

I'm not sure if that's the best solution overall. Does it make sense to set the HttpContext.Current at all in a new thread? Perhaps there's a better way to achieve this. I imagine we want to document this issue though for future users who may need to store legacy classes in the session.

Let me know if you have any questions or repro steps. Thanks.

System.IO.FileNotFoundException in Microsoft.Web.RedisOutputCacheProvider.dll

Hello,

I'm trying to use your provider in my mvc project but when i try to debug my contoller action i see the caching is not working.

And when i read my debug output i can see this error :
Exception thrown: 'System.IO.FileNotFoundException' in Microsoft.Web.RedisOutputCacheProvider.dll

How can i know what is missing ?

This is my caching web.config section :

<caching>
      <outputCache defaultProvider="MyRedisOutputCache" enableOutputCache="true">
          <providers>
              <add name="MyRedisOutputCache" host="192.168.100.168" port="6379" databaseId="2"
                        accessKey="" applicationName="LocalOutputCache" ssl="false"
                        type="Microsoft.Web.Redis.RedisOutputCacheProvider, Microsoft.Web.RedisOutputCacheProvider" />
          </providers>
      </outputCache>
      <outputCacheSettings>
        <outputCacheProfiles>
          <add name="Standard" duration="3600" varyByParam="*" />
          <add name="Static" duration="43200" varyByParam="None" />
        </outputCacheProfiles>
      </outputCacheSettings>
    </caching>

Thanks.

ChangeTrackingSessionStateItemCollection.cs no se encontró

I´m using Redis Session State Provider but when i debugging ocurrs the error

Looking source 'd:\TeamCityBuildAgent\work\f55792526e6d9089\src\Shared\ChangeTrackingSessionStateItemCollection.cs'. Checksum: MD5 {9 f0 b2 17 4d 58 c2 a7 68 b7 2c 14 c1 5e 20 85}
File 'd:\TeamCityBuildAgent\work\f55792526e6d9089\src\Shared\ChangeTrackingSessionStateItemCollection.cs' does not exist.
Searching 'd:\TeamCityBuildAgent\work\f55792526e6d9089\src\Shared\ChangeTrackingSessionStateItemCollection.cs' at documents scripts...
Looking at projects 'd:\TeamCityBuildAgent\work\f55792526e6d9089\src\Shared\ChangeTrackingSessionStateItemCollection.cs'.
The file was not found on a project.
Searching the directory 'C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\crt\src'...
Searching the directory 'C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\crt\src\vccorlib'...
Searching the directory 'C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\atlmfc\src\mfc'...
Searching the directory 'C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\atlmfc\src\atl'...
Searching the directory 'C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\atlmfc\include'...
Searching the directory 'C:'...
The configuration file debugging source code for the active solution indicate that the debugger does not prompt the user to search the file: d:\TeamCityBuildAgent\work\f55792526e6d9089\src\Shared\ChangeTrackingSessionStateItemCollection.cs.
The debugger can not find the source file 'd:\TeamCityBuildAgent\work\f55792526e6d9089\src\Shared\ChangeTrackingSessionStateItemCollection.cs'.

Configuring SessionStateProvider programmatically

Is there a way to configure the SessionStateProvider programmatically ?

More specifically, I would like to change the host address and the accessKey.

I tried to implement my own SessionModule (as shown here) and getting the SessionStateStoreProviderBase through reflection (as shown here), but that's cumbersome and I am not sure if that's going to work in the end.

In short, the reason I want to do this, is that I have different environments where I want to deploy my application, and in my case, it would be more convenient to do it like this than with a Web.Config transform.

Thank you,
Guillaume

SerializationInvoke error

We have implemented Azure Redis Cache as our Session State provider to replace SQL Server provider. In testing we saw no issues but now live we are getting the following error in small batches;

Exception has been thrown by the target of an invocation.
at System.RuntimeMethodHandle.SerializationInvoke(IRuntimeMethodInfo method, Object target, SerializationInfo info, StreamingContext& context)
at System.Runtime.Serialization.ObjectManager.CompleteISerializableObject(Object obj, SerializationInfo info, StreamingContext context)
at System.Runtime.Serialization.ObjectManager.FixupSpecialObject(ObjectHolder holder)
at System.Runtime.Serialization.ObjectManager.DoFixups()
at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, IMethodCallMessage methodCallMessage)
at Microsoft.Web.Redis.RedisUtility.GetObjectFromBytes(Byte[] dataAsBytes) in c:\TeamCity\buildAgent\work\f55792526e6d9089\src\Shared\RedisUtility.cs:line 84
at Microsoft.Web.Redis.StackExchangeClientConnection.GetSessionDataStatic(Object rowDataFromRedis) in c:\TeamCity\buildAgent\work\f55792526e6d9089\src\Shared\StackExchangeClientConnection.cs:line 235
at Microsoft.Web.Redis.RedisConnectionWrapper.TryTakeWriteLockAndGetData(DateTime lockTime, Int32 lockTimeout, Object& lockId, ISessionStateItemCollection& data, Int32& sessionTimeout) in c:\TeamCity\buildAgent\work\f55792526e6d9089\src\RedisSessionStateProvider\RedisConnectionWrapper.cs:line 193
at Microsoft.Web.Redis.RedisSessionStateProvider.GetItemFromSessionStore(Boolean isWriteLockRequired, HttpContext context, String id, Boolean& locked, TimeSpan& lockAge, Object& lockId, SessionStateActions& actions) in c:\TeamCity\buildAgent\work\f55792526e6d9089\src\RedisSessionStateProvider\RedisSessionStateProvider.cs:line 272
at Microsoft.Web.Redis.RedisSessionStateProvider.GetItemExclusive(HttpContext context, String id, Boolean& locked, TimeSpan& lockAge, Object& lockId, SessionStateActions& actions) in c:\TeamCity\buildAgent\work\f55792526e6d9089\src\RedisSessionStateProvider\RedisSessionStateProvider.cs:line 190
at System.Web.SessionState.SessionStateModule.GetSessionStateItem()
at System.Web.SessionState.SessionStateModule.PollLockedSessionCallback(Object state)

Any ideas what could be causing this or how to debug further?

Thanks, Darren

Object reference not set to an instance of an object.

I am unable to install this package. Not sure why. I have a project that I just opened VS 2015 and has various NuGet packages and they all installed OK but this one. Trying to install it through the Package Manager and I keep getting this error.

I opened VS as the Administrator and still get the same error. Below is the output.

Attempting to gather dependencies information for package 'Microsoft.Web.RedisSessionStateProvider.1.6.5' with respect to project 'Client\XXXX.Admin.Host', targeting '.NETFramework,Version=v4.6'
Attempting to resolve dependencies for package 'Microsoft.Web.RedisSessionStateProvider.1.6.5' with DependencyBehavior 'Lowest'
Resolving actions to install package 'Microsoft.Web.RedisSessionStateProvider.1.6.5'
Resolved actions to install package 'Microsoft.Web.RedisSessionStateProvider.1.6.5'
Install failed. Rolling back...
Package 'Microsoft.Web.RedisSessionStateProvider 1.6.5' does not exist in project 'XXXX.Admin.Host'
Package 'Microsoft.Web.RedisSessionStateProvider 1.6.5' does not exist in folder 'C:\DEV\Repos\XXXX.Admin\packages'
System.NullReferenceException: Object reference not set to an instance of an object.
at NuGet.Protocol.Core.v3.GlobalPackagesFolderUtility.d__1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at NuGet.Protocol.Core.v3.DownloadResourceV3.d__4.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at NuGet.PackageManagement.PackageDownloader.d__1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
at NuGet.PackageManagement.NuGetPackageManager.d__42.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at NuGet.PackageManagement.NuGetPackageManager.d__42.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at NuGet.PackageManagement.UI.UIActionEngine.d__5.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at NuGet.PackageManagement.UI.UIActionEngine.d__3.MoveNext()

Below is a screen shot of installing it from Console:
pmconsole

Potential race condition in ChangeTrackingSessionStateItemCollection.cs:GetSessionNormalizedKeyToUse

Hello,

I work on a heavy traffic website and I canary deployed the redis session state provider on one webserver.
As soon as I deployed it I noticed errors popping up in my log:

"System.ArgumentException","Message":"An item with the same key has already been added"

and the stack trace says:
"StackTraceString":" at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)\r\n at System.Collections.Generic.Dictionary2.Insert(TKey key, TValue value, Boolean add)\r\n at Microsoft.Web.Redis.ChangeTrackingSessionStateItemCollection.GetSessionNormalizedKeyToUse(String name) in d:\TeamCityBuildAgent\work\f55792526e6d9089\src\Shared\ChangeTrackingSessionStateItemCollection.cs:line 33\r\n at Microsoft.Web.Redis.ChangeTrackingSessionStateItemCollection.get_Item(String name) in d:\TeamCityBuildAgent\work\f55792526e6d9089\src\Shared\ChangeTrackingSessionStateItemCollection.cs:line 142\r\n`

The result was that I got requests hanging indefinetely in the app pool worker process, causing the app pool to use lots of CPU and had to rollback changes.

This is happening on the home page, when the user requests the page and the JS in the page performs an Ajax requests to load some data.
Both requests pass through some base controller logic which uses the session (same key) and which from time to time causes this race condition when a thread tries to find an entry and another write.

I noticed that the dictionary used in the ChangeTrackingSessionStateItemCollection.cs is not a thread safe data structure, so maybe that's the reason?
Please have a look at this Stack Overflow question for more info on why the race condition.

This is a screenshot of an analyzed set of data from PerfView which shows clearly the same case as the one describe in the SO question above:
image

What do you think?

Error with EntityFramework objects stored in Session

We sometimes - very infrequently, but sometimes - get an error about the DynamicProxies assembly generated by Entity Framework when using the RedisSessionStateProvider.

Here is the error, including stack trace:

Server Error in '/' Application.

Unable to find assembly 'EntityFrameworkDynamicProxies-MyDataDll, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.Runtime.Serialization.SerializationException: Unable to find assembly 'EntityFrameworkDynamicProxies-MyDataDll, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below. 

Stack Trace: 

[SerializationException: Unable to find assembly 'EntityFrameworkDynamicProxies-MyDataDll, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.]
   System.Runtime.Serialization.Formatters.Binary.BinaryAssemblyInfo.GetAssembly() +3444057
   System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetType(BinaryAssemblyInfo assemblyInfo, String name) +11601726
   System.Runtime.Serialization.Formatters.Binary.ObjectMap..ctor(String objectName, String[] memberNames, BinaryTypeEnum[] binaryTypeEnumA, Object[] typeInformationA, Int32[] memberAssemIds, ObjectReader objectReader, Int32 objectId, BinaryAssemblyInfo assemblyInfo, SizedArray assemIdToAssemblyTable) +122
   System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadObjectWithMapTyped(BinaryObjectWithMapTyped record) +286
   System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadObjectWithMapTyped(BinaryHeaderEnum binaryHeaderEnum) +57
   System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run() +461
   System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage) +120
   System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage) +186
   Microsoft.Web.Redis.RedisUtility.GetObjectFromBytes(Byte[] dataAsBytes) +121
   Microsoft.Web.Redis.StackExchangeClientConnection.GetSessionDataStatic(Object rowDataFromRedis) +219
   Microsoft.Web.Redis.StackExchangeClientConnection.GetSessionData(Object rowDataFromRedis) +7
   Microsoft.Web.Redis.RedisConnectionWrapper.TryTakeWriteLockAndGetData(DateTime lockTime, Int32 lockTimeout, Object& lockId, ISessionStateItemCollection& data, Int32& sessionTimeout) +310
   Microsoft.Web.Redis.RedisSessionStateProvider.GetItemFromSessionStore(Boolean isWriteLockRequired, HttpContext context, String id, Boolean& locked, TimeSpan& lockAge, Object& lockId, SessionStateActions& actions) +804
   Microsoft.Web.Redis.RedisSessionStateProvider.GetItemExclusive(HttpContext context, String id, Boolean& locked, TimeSpan& lockAge, Object& lockId, SessionStateActions& actions) +127
   System.Web.SessionState.SessionStateModule.GetSessionStateItem() +111
   System.Web.SessionState.SessionStateModule.PollLockedSessionCallback(Object state) +233

[HttpException (0x80004005): Exception of type 'System.Web.HttpException' was thrown.]
   System.Web.HttpAsyncResult.End() +9643911
   System.Web.SessionState.SessionStateModule.EndAcquireState(IAsyncResult ar) +39
   System.Web.AsyncEventExecutionStep.OnAsyncEventCompletion(IAsyncResult ar) +9670421


Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.6.1055.0

I'm 95% certain that none of the Entity Framework-generated objects I am storing in session are Dynamic Proxies. I've got that turned off for all the places where the objects end up in session. So I'm not sure why this error would be happening. I'm trying to do more testing to be 100% certain.

Have you seen this before? Any ideas? Any idea how to debug the problem to isolate it to certain objects?

System.NullReferenceException in TryUpdateAndReleaseLockIfLockIdMatch

Hello,

we receive the following exception on a regular basis in our productive system (using the RedisSessionStateProvider 1.6.5):

Exception Type: System.NullReferenceException Exception Message: Object reference not set to an instance of an object. Exception Source: mscorlib Exception Target Site: System.Type GetType() Assembly Version: v1.0.0.0 Assembly Build Date: 2016-03-18 09:40:18 ---- Stack Trace ---- System.Object.GetType() : line 0000, col 00 Microsoft.Web.Redis.StackExchangeClientConnection.Eval(script As String, keyArgs As String[], valueArgs As Object[]) : line 0000, col 00, IL 0121 Microsoft.Web.Redis.RedisConnectionWrapper.TryUpdateAndReleaseLockIfLockIdMatch(lockId As Object, data As ISessionStateItemCollection, sessionTimeout As Int32) : line 0000, col 00, IL 0028 Microsoft.Web.Redis.RedisSessionStateProvider.SetAndReleaseItemExclusive(context As HttpContext, id As String, item As SessionStateStoreData, lockId As Object, newItem As Boolean) : line 0000, col 00, IL 0294 System.Web.SessionState.SessionStateModule.OnReleaseState(source As Object, eventArgs As EventArgs) : line 0000, col 00, IL 0477 System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() : line 0000, col 00, IL 0093

I think this error occurs if the LockId Object is null. However, I am still not sure what the actual cause of the error is. Could someone please clarify this issue for me?

Thank!

Upgrade adds new session configuration

If you upgrade this package, and you already have ... already defined, and customProvider is DIFFERENT (like from creating your own config that is not local host), an additional sessionState area in added in the web.config. If this package is upgraded, and sessionState is already defined it should NOT modify that part of the web.config.

Randomly getting No connection is available to service this operation: EVAL error

We have upgraded latest StackExchange libraray "StackExchange.Redis.StrongName 1.1.603".

But our problem still exists. We are getting the following message randomly.

Error Details:

Message: No connection is available to service this operation: EVAL

StackTrace::
at StackExchange.Redis.ConnectionMultiplexer.ExecuteSyncImplT in C:\TeamCity\buildAgent\work\3ae0647004edff78\StackExchange.Redis\StackExchange\Redis\ConnectionMultiplexer.cs:line 1968 at StackExchange.Redis.RedisBase.ExecuteSyncT in C:\TeamCity\buildAgent\work\3ae0647004edff78\StackExchange.Redis\StackExchange\Redis\RedisBase.cs:line 81 at StackExchange.Redis.RedisDatabase.ScriptEvaluate(String script, RedisKey[] keys, RedisValue[] values, CommandFlags flags) in C:\TeamCity\buildAgent\work\3ae0647004edff78\StackExchange.Redis\StackExchange\Redis\RedisDatabase.cs:line 884 at Microsoft.Web.Redis.StackExchangeClientConnection.<>c__DisplayClass4.b__3() in d:\TeamCityBuildAgent\work\f55792526e6d9089\src\Shared\StackExchangeClientConnection.cs:line 117 at Microsoft.Web.Redis.StackExchangeClientConnection.RetryForScriptNotFound(Func1 redisOperation) in d:\TeamCityBuildAgent\work\f55792526e6d9089\src\Shared\StackExchangeClientConnection.cs:line 135 at Microsoft.Web.Redis.StackExchangeClientConnection.RetryLogic(Func1 redisOperation) in d:\TeamCityBuildAgent\work\f55792526e6d9089\src\Shared\StackExchangeClientConnection.cs:line 159 at Microsoft.Web.Redis.StackExchangeClientConnection.Eval(String script, String[] keyArgs, Object[] valueArgs) in d:\TeamCityBuildAgent\work\f55792526e6d9089\src\Shared\StackExchangeClientConnection.cs:line 117 at Microsoft.Web.Redis.RedisConnectionWrapper.TryTakeWriteLockAndGetData(DateTime lockTime, Int32 lockTimeout, Object& lockId, ISessionStateItemCollection& data, Int32& sessionTimeout) in d:\TeamCityBuildAgent\work\f55792526e6d9089\src\RedisSessionStateProvider\RedisConnectionWrapper.cs:line 182 at Microsoft.Web.Redis.RedisSessionStateProvider.GetItemFromSessionStore(Boolean isWriteLockRequired, HttpContext context, String id, Boolean& locked, TimeSpan& lockAge, Object& lockId, SessionStateActions& actions) in d:\TeamCityBuildAgent\work\f55792526e6d9089\src\RedisSessionStateProvider\RedisSessionStateProvider.cs:line 272 at Microsoft.Web.Redis.RedisSessionStateProvider.GetItemExclusive(HttpContext context, String id, Boolean& locked, TimeSpan& lockAge, Object& lockId, SessionStateActions& actions) in d:\TeamCityBuildAgent\work\f55792526e6d9089\src\RedisSessionStateProvider\RedisSessionStateProvider.cs:line 190 at System.Web.SessionState.SessionStateModule.GetSessionStateItem() at System.Web.SessionState.SessionStateModule.BeginAcquireState(Object source, EventArgs e, AsyncCallback cb, Object extraData) at System.Web.HttpApplication.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

Please help.

RedisSessionStateProvider deserializes all session data up-front instead of when Session[key] invoked

Title really says it all. I get serialization errors from a multi-application shared session state environment where not all session key value types exist in every application. A and B types are in both apps, but C is only in the A app. This works fine in other providers I've used because they rely on the built in deserialization behavior of SessionStateItemCollection.

The problem seems to be related to StackExchangeClientConnection.GetSessionData

The loop there invokes redisUtility.GetObjectFromBytes on every item which is a pass-through to serialization.

If you refer to the Microsoft.ApplicationServer.Caching.DataCacheSessionStoreProvider you can see how they handle this serialization so that the application doesn't fall down. Upfront they store the byte[] format of the remote collection, and each item from the store is the start/end position of that object in a stream.

The DataCacheSessionStoreProvider uses the SessionStateItemCollection.Deserialize() method and format for handling this. You can either do that, or you can change the impl of your stored ISessionStateItemCollection.

SessionStateItemCollection.Deserialize is special because it stored the serialized ranges of the session collection in serialized format inside a private field. Every time you access Session[key] it first checks to see if it's in the _serializedItems collection and is not deserialized, and deserializes it. If you don't call that method it won't fill in that collection which forces you to handle the serialization. This should at least be a flag of some sort.

Redis Cluster Support

Can you provide support for redis cluster?
In the last version using a cluster in the connectionstring throw the exception: "Multi-key operations must involve a single slot; keys can use 'hash tags' to help this, i.e. '{/users/12345}/account' and '{/users/12345}/contacts' will always be in the same slot".
The solution is very simple...i think that only changing the format of the key solve the issue.

Provide a custom/extensible serialization mechanism

The current serialization of data to/from redis is based on BinaryFormatter. However, having a custom/extensible mechanism allowing the user to provide/register it's own serializer would be a great addition to this component.

Would you guys be willing to accept some form of pull-request implementing this feature?

Regards

RedisOutputCache - add gives super high expiration time.

Calling RedisOutputCacheConnectionWrapper.Add with expire datetime
generates two commands
Set key value
pexpire key datetime_in_seconds (a very big number "251932173768370")

Calling RedisOutputCacheConnectionWrapper.Set
generates one command
psetex key time_span_milliseconds value - and the timespan is ok

RedisOutputCacheConnectionWrapper line 57 ->
object[] valueArgs = new object[] { RedisUtility.GetBytesFromObject(entry), expiryTime.TotalMilliseconds };

why does the timespan use the totalmilliseconds methos ?

as oppose to StackExchangeClientConnection line 253
TimeSpan timeSpanForExpiry = utcExpiry - DateTime.UtcNow;

Mono: NullReferenceException for concurrent requests

NullReferenceException in Mono web-application (nginx + fast-cgi, Ubuntu 15.04, mono 4.0.3) for concurrent web-requests.

Log:
[2015-08-26 12:49:04.893][Error]GetItemFromSessionStore => System.NullReferenceException: Object reference not set to an instance of an object
at Microsoft.Web.Redis.KeyGenerator.RegenerateKeyStringIfIdModified (System.String id, System.String applicationName) [0x00000] in :0
at Microsoft.Web.Redis.RedisSessionStateProvider.GetAccessToStore (System.String id) [0x00000] in :0
at Microsoft.Web.Redis.RedisSessionStateProvider.GetItemFromSessionStore (Boolean isWriteLockRequired, System.Web.HttpContext context, System.String id, System.Boolean& locked, System.TimeSpan& lockAge, System.Object& lockId, System.Web.SessionState.SessionStateActions& actions) [0x00000] in :0

Web.config session section:

<sessionState mode="Custom" customProvider="RedisSessionStateProvider">
      <providers>
        <add name="RedisSessionStateProvider" type="Microsoft.Web.Redis.RedisSessionStateProvider" host="127.0.0.1" accessKey="" ssl="false" />
      </providers>
    </sessionState>

Thanks.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.