鉴于以下程序:
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((builderContext, config) =>
{
var env = builderContext.HostingEnvironment;
config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables(prefix: "Prefix_");
})
.UseStartup<Startup>();
}
Run Code Online (Sandbox Code Playgroud)
和配置通常定义appsettings.json为:
{
"SomeSection": {
"SomeOption": true
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法将它覆盖为环境变量(使用文档中指定的方法)?
我试过(我在 macOS 上,但同样的问题也发生在 Linux 和 Docker Compose 中):
export Prefix_SomeSection__SomeOption=true
Run Code Online (Sandbox Code Playgroud)
但它被解析为一个字符串,它不能将其转换为布尔值。相同的方法适用于所有其他非布尔选项,这似乎暗示有一些未记录的方法将变量定义为布尔值。
我正在尝试创建类似于Rust Result或Haskell的类型,Either并且我已经做到了这一点:
public struct Result<TResult, TError>
where TResult : notnull
where TError : notnull
{
private readonly OneOf<TResult, TError> Value;
public Result(TResult result) => Value = result;
public Result(TError error) => Value = error;
public static implicit operator Result<TResult, TError>(TResult result)
=> new Result<TResult, TError>(result);
public static implicit operator Result<TResult, TError>(TError error)
=> new Result<TResult, TError>(error);
public void Deconstruct(out TResult? result, out TError? error)
{
result = (Value.IsT0) ? Value.AsT0 : (TResult?)null;
error = (Value.IsT1) ? Value.AsT1 …Run Code Online (Sandbox Code Playgroud) c# generics type-constraints c#-8.0 nullable-reference-types
我正在尝试实现签名 URL 以实现对静态文件的短期访问。这个想法是:
https://example.com/file.png?download=false&expires=1586852158)https://example.com/file.png?download=false&expires=1586852158&signature=6635ea14baeeaaffe71333cf6c7fa1f0af9f6cd1a17abb4e75ca275dec5906d1当我在服务器上收到请求时,我取出signature参数并验证使用 HMACSHA256 签名的 URL 的其余部分以及相同的共享密钥是否会产生相同的签名。
实现如下:
public static class URLSigner
{
private static string GetSignatureForUri(string uri, byte[] key)
{
var hmac = new HMACSHA256(key);
var signature = hmac.ComputeHash(Encoding.UTF8.GetBytes(uri));
var hexSignature = BitConverter.ToString(signature).Replace("-", string.Empty).ToLowerInvariant();
return hexSignature;
}
public static string SignUri(string uri, byte[] key)
{
var hexSignature = GetSignatureForUri(uri, key);
return QueryHelpers.AddQueryString(uri, new Dictionary<string, string> { { "signature", hexSignature }});
}
public static bool VerifyUri(string uri, …Run Code Online (Sandbox Code Playgroud) 我在 MySQL 8 上尝试添加检查约束:
ALTER TABLE `table` ADD CHECK (
(`column_a` IS NULL AND `column_b` IS NOT NULL) OR
(`column_a` IS NOT NULL AND `column_b` IS NULL)
);
Run Code Online (Sandbox Code Playgroud)
但我不断收到此错误:
列“column_b”不能用于检查约束“table_chk_1”:需要在外键约束“table_ibfk_2”引用操作中使用。
我在互联网上的其他任何地方都找不到对此错误的任何参考,我不明白问题是什么。无论column_a和column_b也的外键与其它表,他们都是空。我只想确保中的每一行table都有一个引用 viacolumn_a或 via column_b。
这个错误的原因是什么?
我试图删除外键,添加检查约束并成功。然后,如果我将外键添加回,column_b我仍然会收到相同的错误。