0

我想通过Results.File(). 它在 main 方法 ( app.MapGet) 中执行时有效,但是在不同的方法中返回它什么都不做。它应该发送文件的行在调试器中执行,但是它不返回,而是跳回到主方法执行最后一个返回(永远不应该执行的那个)。最后一次返回确实返回了一个结果。

我也使用了几种方法,例如Result.BadRequest(),但是当它不在 main 方法中时,什么都不执行。

我看到人们使用IResult作为返回方法,但我不确定这是否正确。

我的猜测可能是错误的返回类型或执行任务左右。

整体方法:

    app.MapGet("/", (HttpContext context) =>
    {
        if (context.Request.Query.ContainsKey("amount"))
        {
            if (context.Request.Query["amount"].Count > 1)
            {
                return Results.BadRequest(new { Error = "The query parameter 'amount' may only be used once." });
            }
    
            if (int.TryParse(context.Request.Query["amount"], out int amount))
            {
                if (amount <= 0)
                {
                    return Results.BadRequest(new { Error = "The specified amount must be greater or equal to 1." });
                }
    
                var list = new List<string>();
    
                for (int i = 0; i < amount; i++)
                {
                    list.Add(Ulid.NewUlid().ToString());
                }
    
                CheckIfDownload(context, (list, null));
    
                return Results.Json(new { Ulids = list });
            }
            else
            {
                return Results.BadRequest(new { Error = "The specified amount is not a valid number." });
            }
        }
    
        string ulid = Ulid.NewUlid().ToString();
    
        CheckIfDownload(context, (null, ulid));
    
        return Results.Json(new { Ulid = ulid });
    });
    
    static IResult? CheckIfDownload(HttpContext context, (List<string>? list, string? single) ulidListOrSingle)
    {
        if (context.Request.Query.ContainsKey("download"))
        {
            if (context.Request.Query["download"].Count > 1)
            {
                return Results.BadRequest(new { Error = "The query parameter 'download' may only be used once." });
            }
    
            if (context.Request.Query["download"] == "" || (bool.TryParse(context.Request.Query["download"], out bool download) && download))
            {
                if (ulidListOrSingle.list != null)
                {
                    return SendJsonFile(JsonSerializer.Serialize(ulidListOrSingle.list));
                }
    
                if (ulidListOrSingle.single != null)
                {
                    return SendJsonFile(JsonSerializer.Serialize(ulidListOrSingle.single));
                }
    
                return Results.BadRequest(new { Error = "An unknown error occurred." });
            }
        }
    
        return null;
    }

static IResult SendJsonFile(string data)
{
    byte[] buffer = Encoding.UTF8.GetBytes(data);
    var stream = new MemoryStream(buffer);

    return Results.File(stream, "application/json", $"UlidGenerator_{DateTime.Now:MM-dd-yyyy_HH-mm-ss}.json");
}
4

1 回答 1

2

当您内联整个方法块(不仅仅是单个表达式)时,您必须return成为该块的输出。在您的情况下,您没有捕获SendJsonFile返回结果的结果:

app.MapGet("/download", () =>
{
    string data = "json data";

    var result = SendJsonFile(data);

    return result;
});
于 2022-01-19T14:45:40.153 回答