¿Cómo puedo llamar a un servicio de descanso desde una aplicación Blazor?

blazor rest

Pregunta

Después de crear una aplicación Blazor predeterminada (V0.5.1) obtenemos una página FetchData.cshtml que obtiene sus datos de un archivo .json local

@functions {
    WeatherForecast[] forecasts;

    protected override async Task OnInitAsync()
    {
        forecasts = await Http.GetJsonAsync<WeatherForecast[]>("sample-data/weather.json");
    }

    class WeatherForecast
    {
        public DateTime Date { get; set; }
        public int TemperatureC { get; set; }
        public int TemperatureF { get; set; }
        public string Summary { get; set; }
    }
}

Esto funciona bien. Sin embargo, si cambia esto para obtener los mismos datos de una red web de .net core rest, se cuelga la llamada a Http.GetJsonAsync . No hay error, simplemente nunca se completa.

@functions {
    WeatherForecast[] forecasts;

    protected override async Task OnInitAsync()
    {
        forecasts = await Http.GetJsonAsync<WeatherForecast[]>("sample-data/weather.json");
    }

    class WeatherForecast
    {
        public DateTime Date { get; set; }
        public int TemperatureC { get; set; }
        public int TemperatureF { get; set; }
        public string Summary { get; set; }
    }
}

¿Qué me estoy perdiendo?

Respuesta aceptada

Lo más probable es que te encuentres con un problema de CORS, porque la API y el sitio se ejecutan en un puerto diferente.


Respuesta popular

Necesitaba habilitar Cors, según Cómo habilitas las solicitudes de origen cruzado (CORS) en ASP.NET Core MVC . Agregar un par de líneas al código de servicio web predeterminado hizo el truco.

        public void ConfigureServices(IServiceCollection services)
        {
            // add this
            services.AddCors(); 

            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        }

request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            // and this
            app.UseCors(builder =>
            {
                builder.WithOrigins("http://localhost:5000")
                       .WithMethods("GET", "POST")
                       .AllowAnyHeader();
            });

            app.UseMvc();
        }



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué