小编Kha*_*ine的帖子

我可以从 EF Core 迁移访问应用程序设置吗?

我非常需要通过添加 SQL 脚本来手动修改代码优先迁移。脚本并不完全是一个问题,但我还想向其中注入一些将在 appsettings.json 中设置的内容。除了导航到文件路径并手动读取内容之外,是否可以通过其他方式访问此配置?

c# entity-framework-core asp.net-core

5
推荐指数
1
解决办法
3308
查看次数

Task.WaitAll死锁

我有一个关于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)

c# wpf asynchronous async-await

4
推荐指数
1
解决办法
602
查看次数

如何才能拥有多种身份验证方法而只有一种方法必须成功?

不幸的是我找不到任何可以帮助我解决这个问题的东西。

通常API使用OIDC来处理身份验证,所以我们.AddAuthentication.AddJwtBearer默认使用普通的。这很好用,但我们还需要能够有另一种身份验证方式来提供用户身份,因为令牌并不总是可用。假设它是某个 ApiKey,其中包含给定 ApiKey 的用户字典。

尽管如此,我还是希望 JWT 令牌比另一层具有优先级,因为它只是更强的身份验证。所以它会是这样的:

  1. 我们收到请求
  2. 如果我们看到授权标头,则意味着请求提供了令牌 - 我们想要验证该令牌(如果它无效) - 我们需要 401,因为有些事情不对劲。
  3. 如果 HttpRequest 中没有 Authorization 标头,但我们有 ApiKey 标头 - 我们希望完全省略验证令牌并尝试检查该 ApiKey。如果它有效,我们希望从那里设置 HttpContext.User 并告诉整个身份验证顺利进行,并且我们的控制器可以正常使用 HttpContext.User。

目前,我们有多个支持令牌或 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,因此这很可能不是解决该问题的有效方法。

c# asp.net-core

3
推荐指数
1
解决办法
1477
查看次数

ClosedXML 预定义样式

是否可以在 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)

c# closedxml

2
推荐指数
1
解决办法
2075
查看次数