Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Data caching per request in Owin application

Tags:

asp.net

owin

In traditional ASP.NET applications (that use System.Web), I'm able to cache data in

HttpContext.Current.Items 

Now in Owin the HttpContext is not available anymore. Is there a way to do the similar thing in Owin - a static method/property through which I can set/get per request data?

This question gave some hints but not exact a solution in my case.

like image 691
Calvin Avatar asked Jan 30 '15 00:01

Calvin


People also ask

How to cache database data in c#?

// Read from the cache object value = Cache["key"]; // Add a new item to the cache Cache["key"] = value; Cache. Insert(key, value); Cache. Insert(key, value, CacheDependency); Cache. Insert(key, value, CacheDependency, DateTime, TimeSpan);

What is response caching in .NET core?

Response caching reduces the number of requests a client or proxy makes to a web server. Response caching also reduces the amount of work the web server performs to generate a response. Response caching is controlled by headers that specify how you want client, proxy, and middleware to cache responses.


2 Answers

Finally I found OwinRequestScopeContext. Very simple to use.

In the Startup class:

app.UseRequestScopeContext();

Then I can add per request cache like this:

OwinRequestScopeContext.Current.Items["myclient"] = new Client();

Then anywhere in my code I can do (just like HttpContext.Current):

var currentClient = OwinRequestScopeContext.Current.Items["myclient"] as Client;

Here is the source code if you're curious. It uses CallContext.LogicalGetData and LogicalSetData. Does any one see any problem with this approach of caching request data?

like image 60
Calvin Avatar answered Sep 20 '22 14:09

Calvin


You just need to use OwinContext for this:

From your middleware:

public class HelloWorldMiddleware : OwinMiddleware
{
   public HelloWorldMiddleware (OwinMiddleware next) : base(next) { }

   public override async Task Invoke(IOwinContext context)
   {   
       context.Set("Hello", "World");
       await Next.Invoke(context);     
   }   
}

From MVC or WebApi:

Request.GetOwinContext().Get<string>("Hello");
like image 24
DalSoft Avatar answered Sep 21 '22 14:09

DalSoft