在ASP.NET核心控制器中使用StackExchange.Redis

时间:2017-09-22 15:28:33

标签: dependency-injection asp.net-core redis

我想使用Redis功能,例如来自MVC控制器的位域和哈希字段。我知道ASP.NET核心中有built in caching support,但这只支持基本的GET和SET命令,而不是我应用程序中需要的命令。我知道如何从普通(例如。控制台)应用程序使用StackExchange.Redis,但我不知道如何在ASP站点中设置它。

我应该在哪里放置所有连接初始化代码,以便之后可以从控制器访问它?这是我会使用依赖注入吗?

4 个答案:

答案 0 :(得分:14)

在您的Startup类的ConfigureServices方法中,您将要添加

services.AddSingleton<IConnectionMultiplexer>(ConnectionMultiplexer.Connect("yourConnectionString"));

然后,您可以通过将构造函数签名更改为以下内容来使用依赖项注入:

public YourController : Controller
{
    private IConnectionMultiplexer _connectionMultiplexer;
    public YourController(IConnectionMultiplexer multiplexer)
    {
        this._connectionMultiplexer = multiplexer;
    }
}

答案 1 :(得分:7)

This blog有一个关于在ASP.NET Core中实现redis服务的文章(附带full code repo)。它有一个样板服务,可以自动将POCO类序列化为redis哈希集。

答案 2 :(得分:1)

简单的方法是安装Nuget软件包

Install-Package Microsoft.Extensions.Caching.Redis 

在您的ASP MVC .NET Core项目中。

然后在类Startup中使用ConfigureServices方法配置依赖项注入服务:

        services.AddDistributedRedisCache(option =>
        {
            option.Configuration = Configuration["AzureCache:ConnectionString"];
            option.InstanceName = "master";
        });

在appsettings.json中添加绑定连接字符串以进行发布部署,如下所示:

"AzureCache": {
    "ConnectionString": "" 
  }  

如果使用Azure,请在“应用程序设置”中为ASP MVC .NET Core App Service添加应用程序设置名称,以在部署后在运行时在Azure端进行绑定。出于安全原因,不应在代码中出现用于生产的连接字符串。

Azure binding connection string

添加绑定,例如开发appsettings.Development.json

"AzureCache": {
    "ConnectionString": "<your connection string>"
  }

将服务注入构造函数中的控制器:

public class SomeController : Controller
{
        public SomeController(IDistributedCache distributedCache)

答案 3 :(得分:0)

我更喜欢在配置中使用用户名/密码

@GetMapping(value = "/attachment/{fileId}", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
public Mono<byte[]> get(@PathVariable String fileId) {

    return this.webClient.get()
            .uri(builder ->
                    builder.scheme("https")
                            .host("external-service.com")
                            .path("/{fileId}")
                            .build(fileId)
            ).attributes(clientRegistrationId("credentials"))
            .accept(MediaType.APPLICATION_OCTET_STREAM)
            .retrieve()
            .bodyToMono(byte[].class);
}