Blazor HttpClient застрял в GetAsync - PullRequest
1 голос
/ 02 мая 2019

Я делаю тест в приложении Client Side Blazor, ориентированном на Blazor 3.0.0-preview4-19216-03

Страница бритвы:

@page "/counter"
@using BlazorServiceTest
@inject IWebCrawlServiceAsync WebCrawler

<h1>Counter</h1>

<p>Current count: @debug</p>

<button class="btn btn-primary" onclick="@IncrementCount">Click me</button>

@functions {
    string debug = "";

    async void IncrementCount()
    {
        debug = await WebCrawler.GetWeb();
    }
}

Внедрение зависимости:

using BlazorServiceTest;
using Microsoft.AspNetCore.Components.Builder;
using Microsoft.Extensions.DependencyInjection;

namespace BlazorServicesTest
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {   
            services.AddSingleton<IWebCrawlServiceAsync, WebCrawlServiceAsync>();            
        }

        public void Configure(IComponentsApplicationBuilder app)
        {
            app.AddComponent<App>("app");
        }
    }
}

Служба:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;

namespace BlazorServiceTest
{
    public interface IWebCrawlServiceAsync
    {
        Task<string> GetWeb();
    }

    public class WebCrawlServiceAsync : IWebCrawlServiceAsync
    {
        private HttpClient _client;    

        public WebCrawlServiceAsync(HttpClient client)
        {
            _client = client;
        }

        public async Task<string> GetWeb()
        {
            var response = await _client.GetAsync("https://postman-echo.com/response-headers?foo1=bar1&foo2=bar2");
            var result = await response.Content.ReadAsStringAsync();
            return result;
        }
    }
}

Всякий раз, когда я нажимаю счетчик приращений, ничего не происходит, и вызов службы на GetWeb застревает в вызове GetAsync.

ОБНОВЛЕНИЕ

Если я отлаживаю сервис WebCrawler в отладчике WASM в Chrome, он выполняет запрос

enter image description here

Но раздел ответа пуст:

enter image description here

Ответы [ 3 ]

1 голос
/ 02 мая 2019

Я подозреваю, что это как-то связано с async void.

Вам нужно, чтобы обработчик возвращал Task, а не void

Например

@page "/counter"
@using BlazorServiceTest
@inject IWebCrawlServiceAsync WebCrawler

<h1>Counter</h1>

<p>Current count: @debug</p>

<button class="btn btn-primary" onclick="@IncrementCount">Click me</button>

@functions {
    string debug { get; set; } = "";

    async Task IncrementCount() { //<-- Note Change here
        debug = await WebCrawler.GetWeb();
    }
}

поддержка асинхронного обработчика событий доступна в платформе

Ссылка GitHub Проблема: вызов асинхронной функции с помощью onclick

0 голосов
/ 02 мая 2019

Из клиентского приложения вы можете получить доступ только к своему источнику или сайтам, которые поддерживают CORS.

Чтобы убедиться, что это ваша проблема, вы можете попробовать https://postman-echo.com/response-headers?foo1=bar1&access-control-allow-origin=*, которая может работать.

Но это будет работать только для этого сайта.Обычно вы не контролируете заголовки ответа.Это не исправление.

Итак, клиентская часть Blazor просто не является хорошей платформой для веб-сканера.То же самое касается любого приложения на JS или WASM.

На стороне сервера Blazor не должно быть проблем.Или используйте сервис Web API.

0 голосов
/ 02 мая 2019

Это может быть связано с проблемой конфигурации CORS на сервере, который вы не можете контролировать.Я считаю, что эта проблема не имеет ничего общего с Blazor.Чтобы убедиться в этом, определите локальный файл json в своем приложении и получите к нему доступ с помощью того же кода, который вы используете в своем приложении.

Надеюсь, это сработает ...

ОБНОВЛЕНИЕ

Я не совсем уверен, что запрос не выполнен из-за проблемы конфигурации CORS, по крайней мере, нетисключительно.Мне кажется, что это также связано с SSL / TLS.Это сообщение об ошибке было выдано Fiddler:

fiddler.network.https> HTTPS handshake to fail.System.IO.IOException Невозможно прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто удаленным хостом.<Существующее соединение было принудительно закрыто удаленным хостом </p>

Базовое соединение закрыто, и нельзя установить доверительные отношения для безопасного канала SSL / TLS.

Я полагаю, что 'Я опубликую этот вопрос в github, чтобы лучше понять, что здесь не так.

...