Как вернуть файл другим методом, отличным от основного?
Я хочу скачать файл через
Results.File()
. Он работает при выполнении его в основном методе (
app.MapGet
), однако возврат его другим методом ничего не дает. Строка, куда он должен отправить файл, выполняется в отладчике, однако он не возвращается, а возвращается к основному методу для выполнения последнего возврата (того, который никогда не должен выполняться). Этот последний возврат действительно возвращает результат.
Я также использовал несколько методов, таких как
Result.BadRequest()
, однако ничего не выполняется, если его нет в основном методе.
Я видел людей, использующих
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");
}
1 ответ
когда вы встраиваете весь блок метода (а не только одно выражение), вы должны
return
что вы хотите получить на выходе блока. В вашем случае вы не фиксируете результат
SendJsonFile
вернуть его:
app.MapGet("/download", () =>
{
string data = "json data";
var result = SendJsonFile(data);
return result;
});