Using CacheCow to Cache Based On Parameter

102 views Asked by At

I have a webapi endpoint that looks like the following in my Controller:

[HttpGet]
    public IHttpActionResult GetPerson(
      string term = null,
      string workspace = null)
    {
        try
        {
            logger.Info("AvPerson start: " + DateTime.Now);
            if (term == null)
            {
                return BadRequest();
            }

            ICoreAVData api = MvcApplication.Container.Resolve<ICoreAVData>();

            List<Person> persons = new List<Person>();
            persons.AddRange(api.GetAllPersonsForTerm(term, workspace));

            if (persons == null)
            {
                return NotFound();
            }

            return Ok(persons);
        }
        catch (Exception)
        {
            return InternalServerError();
        }
    }

The term parameter can vary constantly but the workspace parameter displays what is relevant to the user. The user will not leave his own workspace, so that parameter will be constant from a user perspective.

I wonder if it is possible to have CacheCow cache based on the workspace parameter. ie. If workpace1 then cache it, if workspace2 then cache that separately.

I recognize that I will have to have add some kind of logic to invalidate that workspace specific cache. I'm not asking about that, because I believe I know how I might do that. I want to know if I can have a separate cache entry per workspace parameter.

Here is my routing setup for this controller:

config.Routes.MapHttpRoute(
          name: "avperson",
          routeTemplate: "api/v1/avperson/{action}/{id}",
          defaults: new { controller = "avperson", id = RouteParameter.Optional }

       );

Any ideas?

1

There are 1 answers

0
Rymnel On

So the solution is to change the routing.

config.Routes.MapHttpRoute(
      name: "avperson",
      routeTemplate: "api/v1/{workspace}/avperson/{action}/{id}",
      defaults: new { controller = "avperson", workspace = "all", id = RouteParameter.Optional }
);

Doing this will create a separate cached entry for each workspace which can then be validated or invalidated according to need.