【问题标题】:How to return a File in a different method than the main one?如何以与主要方法不同的方法返回文件?
【发布时间】:2022-01-19 23:09:09
【问题描述】:

我想通过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");
}

【问题讨论】:

  • return SendJsonFile(data);
  • 并且您可以删除return Results.BadRequest("This should never be executed!");,因为一旦您实施了 D Stanley 的建议,就无法访​​问该代码。
  • 不,这不起作用,因为这只是一个示例。我使用不同的 IResult 方法检查是否设置了某个查询参数,然后才执行此 SendJsonFile() 方法。
  • 好的,所以发布实际的整个方法 - 你只发布示例 ant 然后告诉我们它不起作用,因为你的实际代码不同,这浪费了我们俩的时间。或者阅读并理解评论背后的原理,并将其应用到您的实际情况中......
  • @Steven2105 不,这意味着您需要从您的MapGet 方法返回正确的值。你现在所拥有的,就相当于我向你要啤酒,你去酒吧买啤酒,然后你把啤酒扔掉,递给我一杯水。如果你这样做了,你会不会对为什么我没有收到我的啤酒感到困惑?

标签: c# asp.net asp.net-core asp.net-web-api minimal-apis


【解决方案1】:

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

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

    var result = SendJsonFile(data);

    return result;
});

【讨论】:

    猜你喜欢
    • 2014-01-14
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多