【发布时间】: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