На самом деле, метод Peek
сначала читает поток в его буфер, а затем выдает из него значение (взгляните на do tnet runtime repo ). Таким образом, он перемещает положение потока. Однако функциональность просмотра не может быть реализована без чтения и, следовательно, поиска потока.
Поскольку вы не можете искать HttpRequestStream назад, лучшей стратегией было бы прочитать весь контент, а затем использовать Utf8JsonReader
, чтобы определить, является ли запрос объект или массив. Обратите внимание, что Utf8JsonReader
нельзя объявить в асинхронных c методах, поэтому мне пришлось поместить его в отдельный не асинхронный c метод.
private static JsonTokenType GetTokenType(byte[] bytes)
{
var reader = new Utf8JsonReader(bytes.AsSpan());
reader.Read();
return reader.TokenType;
}
var ms = new MemoryStream();
await Request.Body.CopyToAsync(ms);
var jsonBytes = ms.ToArray();
switch (GetTokenType(jsonBytes))
{
case JsonTokenType.StartObject:
return JsonSerializer.Deserialize<GraphQLRequest>(jsonBytes);
case JsonTokenType.StartArray:
return JsonSerializer.Deserialize<GraphQLRequest[]>(jsonBytes);
default:
// ...
}