Я делаю тест в приложении 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

4
Fritjof Berggren 2 Май 2019 в 16:48

3 ответа

Лучший ответ

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

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

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

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

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

1
Henk Holterman 4 Май 2019 в 06:27

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

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

< Сильный > UPDATE

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

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

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

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

1
enet 3 Май 2019 в 18:18

Я подозреваю, что это как-то связано с 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

1
Nkosi 2 Май 2019 в 16:08