在 Asp.net 核心启动时创建的 SQL 分布式缓存
Posted
技术标签:
【中文标题】在 Asp.net 核心启动时创建的 SQL 分布式缓存【英文标题】:SQL distributed cache created on Asp.net core startup 【发布时间】:2019-04-24 04:24:53 【问题描述】:我想知道是否有办法在 ASP.NET Core 2.1 应用程序启动时创建 SQL 分布式缓存。
我知道我可以运行这个命令
dotnet sql-cache create <connection string> <schema> <table name>
但这是一个手动过程。我想在启动时自动执行此过程。
这可能吗?
谢谢
【问题讨论】:
startup
我猜你的意思是during deployment
?没有理由每次网站启动时都创建缓存,它应该已经存在。为什么不使用用于其他数据库的 same 部署技术?如果缓存表与应用程序的表存储在同一个数据库中,您只需将其包含在部署脚本中
【参考方案1】:
这里有两个选项:
选项1
由于我们可以运行命令来创建表,我们可以从Process
的代码中运行命令。
public static IServiceCollection ConfigureSqlCacheFromCommand(this IServiceCollection services)
var options = services.BuildServiceProvider().GetRequiredService<IOptions<SqlServerCacheOptions>>();
var process = new Process()
StartInfo = new ProcessStartInfo
FileName = "cmd.exe",
Arguments = $"/c dotnet sql-cache create \"options.Value.ConnectionString\" options.Value.SchemaName options.Value.TableName ",
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = false,
WindowStyle = ProcessWindowStyle.Normal,
RedirectStandardInput = true,
RedirectStandardError = true
;
process.Start();
string input = process.StandardError.ReadToEnd();
string result = process.StandardOutput.ReadToEnd();
process.WaitForExit();
return services;
选项2
对于dotnet sql-cache
命令,它也调用dotnet-sql-cache,您可以实现代码以编程方式创建表。
private static int CreateTableAndIndexes(SqlServerCacheOptions options)
using (var connection = new SqlConnection(options.ConnectionString))
connection.Open();
var sqlQueries = new SqlQueries(options.SchemaName, options.TableName);
var command = new SqlCommand(sqlQueries.TableInfo, connection);
using (var reader = command.ExecuteReader(CommandBehavior.SingleRow))
if (reader.Read())
return 1;
using (var transaction = connection.BeginTransaction())
try
command = new SqlCommand(sqlQueries.CreateTable, connection, transaction);
command.ExecuteNonQuery();
command = new SqlCommand(
sqlQueries.CreateNonClusteredIndexOnExpirationTime,
connection,
transaction);
command.ExecuteNonQuery();
transaction.Commit();
catch (Exception ex)
transaction.Rollback();
return 1;
return 0;
调用CreateTableAndIndexes
,可以实现这个扩展方法:
public static IServiceCollection ConfigureSqlCache(this IServiceCollection services)
var options = services.BuildServiceProvider().GetRequiredService<IOptions<SqlServerCacheOptions>>();
int result = CreateTableAndIndexes(options.Value);
return services;
用于配置Startup.cs
services.AddDistributedSqlServerCache(options =>
options.ConnectionString = @"Server=localhost\MSSQLSERVER01;Database=IISWindows;Trusted_Connection=True;";
options.TableName = "CacheFromCommand";
options.SchemaName = "dbo";
);
//services.ConfigureSqlCache();
services.ConfigureSqlCacheFromCommand();
注意
SqlQueries
来自SqlQueries。
安装包Microsoft.Extensions.CommandLineUtils
。
services.AddDistributedSqlServerCache
之后注册ConfigureSqlCache
【讨论】:
对于任何尝试使用第二个选项的人来说,由于 SqlQueries 类是 sql-cache 工具程序的内部(保护级别)类,这不再可能,因此无法再访问它.作为另一种解决方法,您始终可以将该命令作为构建/部署的一部分运行,例如通过您的 csproj 文件。除非我只是误解了如何实现代码/在哪里运行它。【参考方案2】:您希望如何自动执行此操作?我敢肯定,但有很多方法可以添加分布式缓存。
您可以通过以下链接查看示例:
https://docs.microsoft.com/en-us/aspnet/core/performance/caching/distributed?view=aspnetcore-2.1
【讨论】:
以上是关于在 Asp.net 核心启动时创建的 SQL 分布式缓存的主要内容,如果未能解决你的问题,请参考以下文章
为 dotnet core asp.net 运行 CRUD 脚手架时出错
asp.net Web API核心项目启动类里面的SetCompatibilityVersion是啥