我非常需要通过添加 SQL 脚本来手动修改代码优先迁移。脚本并不完全是一个问题,但我还想向其中注入一些将在 appsettings.json 中设置的内容。除了导航到文件路径并手动读取内容之外,是否可以通过其他方式访问此配置?
我有一个关于Task.WaitAll的问题.起初我尝试使用async/await来得到这样的东西:
private async Task ReadImagesAsync(string HTMLtag)
{
await Task.Run(() =>
{
ReadImages(HTMLtag);
});
}
Run Code Online (Sandbox Code Playgroud)
这个功能的内容无关紧要,它同步工作,完全独立于外界.
我这样使用它:
private void Execute()
{
string tags = ConfigurationManager.AppSettings["HTMLTags"];
var cursor = Mouse.OverrideCursor;
Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait;
List<Task> tasks = new List<Task>();
foreach (string tag in tags.Split(';'))
{
tasks.Add(ReadImagesAsync(tag));
//tasks.Add(Task.Run(() => ReadImages(tag)));
}
Task.WaitAll(tasks.ToArray());
Mouse.OverrideCursor = cursor;
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,Task.WaitAll
如果我以这种方式使用它(使用async/await),我会遇到死锁.我的函数完成它们的工作(所以它们被正确执行),但Task.WaitAll
只是永远停留在这里,因为显然ReadImagesAsync不会返回给调用者.
注释行是实际正常工作的方法.如果我对tasks.Add(ReadImagesAsync(tag));
线路进行评论并使用tasks.Add(Task.Run(() => ReadImages(tag)));
- 一切运作良好.
我在这里错过了什么?
ReadImages方法看起来像这样:
private void ReadImages (string HTMLtag)
{
string section = HTMLtag.Split(':')[0];
string tag = …
Run Code Online (Sandbox Code Playgroud) 不幸的是我找不到任何可以帮助我解决这个问题的东西。
通常API使用OIDC来处理身份验证,所以我们.AddAuthentication.AddJwtBearer
默认使用普通的。这很好用,但我们还需要能够有另一种身份验证方式来提供用户身份,因为令牌并不总是可用。假设它是某个 ApiKey,其中包含给定 ApiKey 的用户字典。
尽管如此,我还是希望 JWT 令牌比另一层具有优先级,因为它只是更强的身份验证。所以它会是这样的:
目前,我们有多个支持令牌或 ApiKey(不同属性)场景的控制器端点,但是当控制器和端点数量增加时,复制所有内容可能会非常痛苦。
我尝试附加到一些JwtBearerEvents
标头并检查那里的标头,这样如果我发现我们没有可用的令牌,我可以手动完成身份验证,例如:
OnMessageReceived = async context =>
{
if (!context.Request.Headers.ContainsKey("Authorization")
&& context.Request.Headers.ContainsKey("ApiKey"))
{
// some logic to check that ApiKey
context.Principal = new ClaimsPrincipal(new ClaimsIdentity(
new Claim[]
{
new Claim(ClaimTypes.NameIdentifier, "ApiKeyUser")
}));
context.Success();
}
await Task.CompletedTask;
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,中间件无论如何都坚持检查令牌并返回 401,因此这很可能不是解决该问题的有效方法。
是否可以在 ClosedXML 中创建和存储预定义样式,以便稍后将其应用于某个范围?就像 Excel 可以。例如通过静态类:
public static class ReportStyle
{
public static XLStyle Default {
get {
XLStyle style = new XLStyle(); //or something like that, I want a different XLStyle object
style.Font. //etc, all the changes
return style;
}
}
}
Run Code Online (Sandbox Code Playgroud)
后来我想做类似的事情:
range.Style = ReportStyle.Default;
Run Code Online (Sandbox Code Playgroud)
我想预先定义其中的一些,因为每个都可以在文档的不同部分多次使用,例如在不同的工作表中。现在我创建了一个粗略的解决方法,即隐藏在委托下的方法,因此我可以将它们存储在我的模块中(太多无法解释 - 我只需要将样式存储为对象 - 因为我需要复制它的能力):
public delegate bool StyleDelegate(IXLRange range);
Run Code Online (Sandbox Code Playgroud)
然后我可以将我的样式更改方法存储在里面,并在稍后的样式应用阶段调用它:
public static void SetStyleDefault(IXLRange range){
//do some style changes for this range
}
public StyleDelegate Style { get; set; } = …
Run Code Online (Sandbox Code Playgroud)