Базовый адрес HttpClient больше не назначается в веб-приложении Blazor

Показанный здесь код работает в серверном проекте ASP.NET Core 8.0 Blazor, но не работает в веб-приложении Blazor, созданном с «Режимом интерактивной визуализации: сервер» и «Местоположение интерактивности: глобальное» (приложение не запускается). с выбранным базовым адресом, который должен быть https://localhost:7122/Identity/Account/Login?ReturnUrl=%2F ). Я прочитал эту статью о документах Microsoft, но надеюсь, что мне не придется идти по этому пути и что есть более простое решение, поскольку все мои проекты выполняются только на стороне сервера.

program.cs
    builder.Services
           .AddScoped(sp => new HttpClient 
                                { 
                                    BaseAddress = new Uri("https://localhost:7122/")

                            });

Деталь «не работает». Какой режим рендеринга и где это прописать?

Henk Holterman 25.08.2024 23:04

@Хенк Холтерман Я обновил вопрос. rendermode InteractiveServer приложение работает нормально, но базовый адрес больше не установлен, как в другом серверном приложении Blazor в том же решении

Ben Junior 26.08.2024 04:10

Сколько program.cs файлов в вашем решении?

Henk Holterman 26.08.2024 08:54

@Henk Holterman В решении есть два полностью разделенных проекта с program.cs: один — это веб-приложение Blazor, а другой — SSR, но они вообще не пересекаются с какими-либо ссылками, а просто используют некоторые общие библиотеки и компоненты.

Ben Junior 26.08.2024 15:38
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как сказано в документе , для рендеринга на стороне клиента (CSR), который включает в себя компоненты Interactive WebAssembly и компоненты Auto, которые приняли CSR, вызовы выполняются с помощью предварительно настроенного HttpClient, зарегистрированного в файле программы клиентского проекта (BlazorApp.Client). ):

builder.Services.AddScoped(sp =>
    new HttpClient
    {
        BaseAddress = new Uri(builder.Configuration["FrontendUrl"] ?? "https://localhost:5002")
    });

Поэтому, если вы используете рендеринг на стороне сервера (в настоящее время вы используете SSR), который включает в себя предварительно обработанные и интерактивные серверные компоненты, предварительно обработанные компоненты WebAssembly и автоматические компоненты, которые предварительно обработаны или приняли SSR, вызовы выполняются с помощью HttpClient, зарегистрированного в Программный файл серверного проекта.

Как показано ниже:

builder.Services.AddHttpClient("localtest", httpClient =>
{
    httpClient.BaseAddress = new Uri("https://localhost:7047");

});

Использование:

@page "/"
@inject IHttpClientFactory _httpClientFactory
<PageTitle>Home</PageTitle>

<h1>Hello, world!</h1>

Welcome to your new app.
 
@code{

    protected override async Task OnInitializedAsync()
    {
        var httpClient = _httpClientFactory.CreateClient("localtest");
        var httpResponseMessage = await httpClient.GetAsync(
            "WeatherForecast");
  

        if (httpResponseMessage.IsSuccessStatusCode)
        {
            using var contentStream =
                await httpResponseMessage.Content.ReadAsStreamAsync();

            
        }
    }


}

Результат:

Все, что мне нужно, это чтобы при развертывании приложения оно начиналось с адреса «mycompany.com...». Вот и все. До «Blazor Web App» оно работало нормально, теперь это не так. Я понял ваш ответ до «Использования»: но куда делся метод «защищенное переопределение асинхронной задачи OnInitializedAsync()»? и нужно ли его вызывать для каждой страницы?

Ben Junior 27.08.2024 03:59

Во-первых, вам нужно четко указать, в чем заключается ваш вопрос: httpclient используется для отправки запроса внутри этого приложения Blazor в другое приложение. Метод, который я использовал, — это всего лишь тестовый пример того, как можно использовать httpclient для отправки запроса. All I need is that when the app is deployed it will start with the address "mycompany.com..." That is all, если вы просто хотите установить домен для этого веб-приложения Blazor, это не связано с кодами.

Brando Zhang 27.08.2024 04:06

Хорошо. У решения также есть предыдущий проект «Серверное приложение Blazor», и код в моем вопросе отлично работает на нем. В разработке он всегда открывается на «localhost:7122», а при развертывании — на «mycompany.com». Новый проект «Веб-приложение Blazor» был создан с использованием «Интерактивного режима рендеринга: Сервер» и «Местоположение интерактивности: Глобальный», но исходный код, указанный в моем вопросе, теперь игнорируется. Как это можно реализовать в новом проекте, чтобы добиться того же результата, что и в предыдущем проекте?

Ben Junior 27.08.2024 04:42

Используя мои новые коды, используя var httpClient = _httpClientFactory.CreateClient("localtest"); var httpResponseMessage = await httpClient.GetAsync( "WeatherForecast"); можно добиться того же самого. Измените коды program.cs, указав здесь новый URL-адрес httpClient.BaseAddress = new Uri("https://localhost:7047");

Brando Zhang 27.08.2024 05:22

Это коды компонентов Blazor, вы можете поместить их внутрь компонента, пожалуйста, проверьте мои коды обновления.

Brando Zhang 28.08.2024 03:27

Другие вопросы по теме