Ошибка 'TypeError: Failed to fetch' при попытке вызвать AspNetCore Restful API из Blazor Wasm - PullRequest
0 голосов
/ 19 апреля 2020

При попытке вызвать мой API AspNetCore Restful из Blazor Wasm я получаю сообщение об ошибке TypeError: Failed to fetch. Я могу позвонить ему из Почтальона, и он прекрасно работает.

Мое окружение: Microsoft Visual Studio Community 2019 Preview Версия 16.6.0 Preview 3.0

Клиент: Blazor Wasm Service (dotnetstandard 2.1)

  • As pNet .WebApi.Client 5.2.7
  • AspNetCore..WebAssembly 3.2 Предварительный просмотр 4.2
  • Система . Net .Http. Json 3.2 Предварительный просмотр 5.2

Важные значения:

using Microsoft.AspNetCore.JsonPatch;
using Newtonsoft.Json;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Net.Http.Json;

Родительское пространство имен и класс опущены _httpClient внедряется в родительский класс

public async Task<MyDto> UpdatePartialAsync(Guid primaryId, ObjectForUpdateDto objectForUpdateDto)
{

    MyDto dtoFromApi = null;

    var patchDoc = new JsonPatchDocument<ObjectForUpdateDto>()
        .Replace(o => o.Name, objectForUpdateDto.Name)
        .Replace(o => o.Description, objectForUpdateDto.Description)

    var uri = $"MyUri/myResources/{primaryId}";

    try
    {
        _httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        var serializedPatchDoc = JsonConvert.SerializeObject(patchDoc);
        var json = new StringContent(serializedPatchDoc, Encoding.UTF8, "application/json-patch+json");

        var response = await _httpClient.PatchAsync(uri, json);
        return await response.Content.ReadAsAsync<MyDto>();
    }
    catch (Exception)
    {   
        throw; //throws 'TypeError: Failed to fetch'
    }

    return dtoFromApi;
}

Мой API (. Net 5.0, также пробовал. Net Core 3.1):

[HttpPatch]
[Route("{primaryId}")]
public ActionResult UpsertPartial([FromRoute]Guid primaryId, [FromBody] JsonPatchDocument<ObjectForUpdateDto> objectForUpdateDto)
{
    //client call never makes it here
    return NoContent();
}

1 Ответ

0 голосов
/ 20 апреля 2020

OMG! Что за вводящее в заблуждение сообщение об ошибке. Это была проблема CORS.

Исправление добавляло «PATCH» к моей политике CORS в методе API моего startup.cs ConfigureServices (ранее это был «GET, DELETE, PUT, POST, OPTIONS»).

services.AddCors(options =>
{
    options.AddPolicy(CorsAllowAll,
    builder =>
    {
        builder.WithOrigins(Constants.ApiClientCors).AllowAnyHeader().WithMethods("GET, PATCH, DELETE, PUT, POST, OPTIONS");
    });

});
...