Передача переменной DateTime контроллеру вызывает ошибку

#json #json.net #blazor #blazor-webassembly

Вопрос:

Я встраиваю небольшую функцию прогнозирования в свое приложение. Столкнувшись с проблемой, которую я, кажется, не могу понять. Я вычисляю некоторые основные результаты и возвращаю словарь, содержащий 2 результата. Подумал, что это был бы хороший способ вернуть оба результата из одной функции вместо вызова двух. Я нашел некоторые предлагаемые решения для этой ошибки, такие как преобразование даты и времени в строку, но это тоже не сработало для меня. Был бы признателен за любое понимание причины ошибки. Заранее спасибо.

Ошибка

 Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100]
Unhandled exception rendering component: '<' is an invalid start of a value. Path: $ | LineNumber: 0 | BytePositionInLine: 0.
    System.Text.Json.JsonException: '<' is an invalid start of a value. Path: $ | LineNumber: 0 | BytePositionInLine: 0.
     ---> System.Text.Json.JsonReaderException: '<' is an invalid start of a value. LineNumber: 0 | BytePositionInLine: 0.
       at System.Text.Json.ThrowHelper.ThrowJsonReaderException(Utf8JsonReaderamp; json, ExceptionResource resource, Byte nextByte, ReadOnlySpan`1 bytes)
       at System.Text.Json.Utf8JsonReader.ConsumeValue(Byte marker)
       at System.Text.Json.Utf8JsonReader.ReadFirstToken(Byte first)
       at System.Text.Json.Utf8JsonReader.ReadSingleSegment()
       at System.Text.Json.Utf8JsonReader.Read()
       at System.Text.Json.Serialization.JsonConverter`1[[System.Collections.Generic.Dictionary`2[[System.String, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.Int32, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].ReadCore(Utf8JsonReaderamp; reader, JsonSerializerOptions options, ReadStackamp; state)
       --- End of inner exception stack trace ---
       at System.Text.Json.ThrowHelper.ReThrowWithPath(ReadStackamp; state, JsonReaderException ex)
       at System.Text.Json.Serialization.JsonConverter`1[[System.Collections.Generic.Dictionary`2[[System.String, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.Int32, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].ReadCore(Utf8JsonReaderamp; reader, JsonSerializerOptions options, ReadStackamp; state)
       at System.Text.Json.JsonSerializer.ReadCore[Dictionary`2](JsonConverter jsonConverter, Utf8JsonReaderamp; reader, JsonSerializerOptions options, ReadStackamp; state)
       at System.Text.Json.JsonSerializer.ReadCore[Dictionary`2](JsonReaderStateamp; readerState, Boolean isFinalBlock, ReadOnlySpan`1 buffer, JsonSerializerOptions options, ReadStackamp; state, JsonConverter converterBase)
       at System.Text.Json.JsonSerializer.<ReadAsync>d__20`1[[System.Collections.Generic.Dictionary`2[[System.String, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.Int32, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].MoveNext()
       at System.Net.Http.Json.HttpContentJsonExtensions.<ReadFromJsonAsyncCore>d__3`1[[System.Collections.Generic.Dictionary`2[[System.String, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.Int32, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].MoveNext()
       at System.Net.Http.Json.HttpClientJsonExtensions.<GetFromJsonAsyncCore>d__9`1[[System.Collections.Generic.Dictionary`2[[System.String, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.Int32, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].MoveNext()
       at WebApp.Client.Pages.Prediction.Predict.InitPrediction() in C:UserssourcereposWebAppWebAppClientPagesPredictionPredict.razor:line 48
       at Microsoft.AspNetCore.Components.ComponentBase.CallStateHasChangedOnAsyncCompletion(Task task)
       at Microsoft.AspNetCore.Components.Forms.EditForm.HandleSubmitAsync()
       at Microsoft.AspNetCore.Components.ComponentBase.CallStateHasChangedOnAsyncCompletion(Task task)
       at Microsoft.AspNetCore.Components.RenderTree.Renderer.GetErrorHandledTask(Task taskToHandle)
 

Эта ошибка начала возникать только тогда, когда я начал передавать переменную DateTime при выполнении запроса Get

Страница бритвы: проблематично

 [CascadingParameter]
private DateTime selectedDate { get; set; } = new DateTime();
private Dictionary<string, int> predictedInfo = new Dictionary<string, int>();

 private async Task InitPrediction()
    {
        predictedInfo = await http.GetFromJsonAsync<Dictionary<string, int>>($"Prediction/{selectedDate}");
        Navigation.NavigateTo("/prediction");
    }
 

Контроллер: проблема

 [HttpGet("{date}")]
public async Task<ActionResult<Dictionary<string, int>>> GetProjects(DateTime date)
{

  int total_projects_per_company = 0;
  int users_per_project_sum = 0;

  Dictionary<string, int> d = new Dictionary<string, int>();

// calculation code...


  d.Add("users", users_per_project_sum);
  d.Add("projects", total_projects_per_company);
  return d;
}
 

Проблема не возникает, когда я не передаю дату-время, и я не уверен, какова корреляция между этим.

Страница бритвы: Не вызывает проблем

 [CascadingParameter]
private DateTime selectedDate { get; set; } = new DateTime();
private Dictionary<string, int> predictedInfo = new Dictionary<string, int>();

private async Task InitPrediction()
{
  predictedInfo = await http.GetFromJsonAsync<Dictionary<string, int>>("Prediction");
  Navigation.NavigateTo("/prediction");
}
 

Контроллер: Не вызывает проблем

 [HttpGet]
public async Task<ActionResult<Dictionary<string, int>>> GetProjects()
{
  int total_projects_per_company = 0;
  int users_per_project_sum = 0;

  Dictionary<string, int> d = new Dictionary<string, int>();
 // calculation code...
  d.Add("users", users_per_project_sum);
  d.Add("projects", total_projects_per_company);
  return d;
}
 

Комментарии:

1. Ошибка указывает на то, что, скорее всего, вместо JSON возвращается HTML (почти наверняка одна из страниц ошибок по умолчанию). Вероятно, на сервере произошла какая-то ошибка, которая приводит к появлению страницы с ошибкой.

2. '<' is an invalid start of a value. Path: $ | LineNumber: 0 | BytePositionInLine: 0. означает, что < символ был встречен как первый символ потока JSON. Это обычно указывает на то, что JSON на самом деле был HTML или XML, как упоминалось выше.

3. Я не уверен, что могло бы вызвать ошибку на сервере. Все, что я сделал по-другому, — это ввел дату и время в функцию контроллера. Совсем запутался с этим

4. Приложению никогда не удается вызвать функцию на контроллере. Он попадает в строку predictedInfo = await http.GetFromJsonAsync<Dictionary<string, int>>($"Prediction/{selectedDate}"); , выдает ошибку и останавливается. Функция на контроллере никогда не используется и не вызывается приложением

5. @Krellex, используйте инструменты разработчика вашего браузера, чтобы изучить ответ сервера. Поскольку я ожидаю, что он будет содержать сообщение об ошибке, этого должно быть достаточно для диагностики вашей проблемы.