Я делаю тест в приложении 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, он выполняет запрос
Но раздел ответа пуст:
3 ответа
Из клиентского приложения вы можете получить доступ только к своему источнику или сайтам, которые поддерживают CORS.
Чтобы убедиться, что это ваша проблема, вы можете попробовать https://postman-echo.com/response-headers?foo1=bar1&access-control-allow-origin=*
, это может сработать.
Но это будет работать только для этого сайта. Обычно вы не контролируете заголовки ответа. Это не исправление.
Таким образом, клиентская часть Blazor просто не является хорошей платформой для веб-сканера. То же самое касается любого приложения на JS или WASM.
У Blazor на стороне сервера не должно быть проблем. Или используйте сервис Web API.
Это может быть связано с проблемой конфигурации CORS на сервере, который вы не можете контролировать. Я считаю, что эта проблема не имеет ничего общего с Blazor. Чтобы убедиться в этом, определите локальный файл json в своем приложении и получите к нему доступ с помощью того же кода, который вы используете в своем приложении.
Надеюсь, это работает ...
< Сильный > UPDATE
Я не совсем уверен, что запрос не выполняется из-за проблемы конфигурации CORS, по крайней мере, не исключительно. Мне кажется, что это также связано с SSL / TLS. Это сообщение об ошибке было выдано Fiddler:
fiddler.network.https> HTTPS-соединение не удалось. System.IO.IOException Невозможно прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто удаленным хостом. <Существующее соединение было принудительно закрыто удаленным хостом
Базовое соединение закрыто, и нельзя установить доверительные отношения для безопасного канала SSL / TLS.
Думаю, я опубликую этот вопрос в github, чтобы лучше понять, что здесь пошло не так.
Я подозреваю, что это как-то связано с 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
Похожие вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.