【问题标题】:.net 6 Minimal Api with Role Based Authorization Error System.NotSupportedException: Serialization and deserialization of 'System.Func`.net 6 Minimal Api with Role Based Authorization Error System.NotSupportedException:“System.Func”的序列化和反序列化
【发布时间】:2022-07-27 00:39:39
【问题描述】:

尝试将角色授权添加到最小 api,但我不明白为什么这个简单的测试不起作用。我可以确认该角色有效。

在我的 Program.cs 中

我有app.ConfigureApi();

在 Api.cs 中

public static class Api
{
    public static void ConfigureApi(this WebApplication app)
    { 
   // This works
        app.MapGet("/Hello/", [Authorize(Roles = Roles.Manager)] () =>
        {
            return Results.Ok("hello test");

        });

        //this works
        app.MapGet("/HolaNoAutho/", GetHola);


        //This does not work. Errors out. 
        app.MapGet("/HelloAutho/", [Authorize(Roles = Roles.Manager)]() => GetHola);


    }
   private static async Task<IResult> GetHola()
    {
        try
        {
            return Results.Ok("Hola Test");

        }
        catch (Exception ex)
        {

            return Results.Problem(ex.Message);
        }
    }


}

知道如何使用最少的 api 进行此工作角色授权吗?

错误是“ System.NotSupportedException:'System.Func1[[System.Threading.Tasks.Task1[[Microsoft.AspNetCore.Http.IResult, Microsoft.AspNetCore.Http.Abstractions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60]] 的序列化和反序列化, System.Private.CoreLib、Version=6.0.0.0、Culture=neutral、PublicKeyToken=7cec85d7bea7798e]]' 实例不受支持。不受支持的成员类型位于类型“System.Func1[System.Threading.Tasks.Task1[Microsoft.AspNetCore.Http.IResult]]”上。路径:$。”

【问题讨论】:

  • 只需将您的属性移动到 GetHola 方法即可。
  • 我不理解坚持在最小的 api 之上构建成熟的应用程序。它最初是为快速 poc 应用程序设计的,最近我看到了很多关于最小 api 在将其用于实际应用程序时引起的所有困惑和问题的问题。

标签: c# .net-6.0 minimal-apis


【解决方案1】:

"/HelloAutho/" 的处理程序返回一个函数,因为编译器功能允许它将函数名称 (method group) 转换为委托。所以如下:

[Authorize(Roles = Roles.Manager)]() => GetHola

可以这样查看:

[Authorize(Roles = Roles.Manager)]() => {
    Func<Task<IResult>> func = GetHola;
    return func ;
}

所以你唯一需要做的就是通过添加括号来调用函数:

app.MapGet("/HelloAutho/", [Authorize(Roles = Roles.Manager)]() => GetHola());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    相关资源
    最近更新 更多