【问题标题】:Blazor service injection not working properlyBlazor 服务注入无法正常工作
【发布时间】:2019-04-23 16:04:38
【问题描述】:

我在 Blazor 3.0.0-preview4-19216-03 中有此代码针对客户端应用程序:

namespace BlazorShared.Services
{
    public interface ILogin
    {
        Task<string> Login();
    }

    public class LoginService : ILogin
    {
        private HttpClient _client;

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

        public async Task<string> Login()
        {
            var myclient = new HttpClient();

            var responseMessage = await myclient.GetAsync("http://www.google.es");
            var content = await responseMessage.Content.ReadAsStringAsync();

            Debug.WriteLine(content);

            return content;
        }
    }
}

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton<ILogin, LoginService>();
    }

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

还有这个 HTML

@functions {
    public async Task Submit()
    {
        var str = await LoginService.Login(null, null, null);
        Console.WriteLine(str);
    }
}

完整的 Razor 文件:https://pastebin.com/3LbQQvk0

我已经对其进行了测试,但网络请求永远不会完成,我无法在客户端中显示服务响应。我已经尝试在instructions 之后在 chrome 中进行调试,我看到正在调用服务方法,但没有调用服务的构造函数,据我所知,Blazor 应该注入 HttpClient。任何想法会发生什么?谢谢。

【问题讨论】:

  • 您的帖子中没有包含@inject 行。添加它以使我们放心。
  • 我已将完整的 Razor 代码上传到:pastebin.com/3LbQQvk0

标签: c# asp.net-core blazor


【解决方案1】:

即使不是罪魁祸首,以下也是错误的...... 在 LoginService 中,您定义一个 HttpClient 变量,将 DI 提供的 HttpClient 实例分配给该变量。另一方面,您定义了一个名为 myclient 的新 HttpClient 对象并在 Login 方法中使用它。

您应该使用 DI 提供的对象。您不应该自己定义 HttpClient 对象。为什么 ?因为 Blazor 为您配置了它创建的 HttpClient。例如,设置 Document base URI,使您的 Web 应用程序可以作为 SPA 应用程序进行导航。

希望这会有所帮助...

【讨论】:

  • 他也不应该在构造函数中使用HttpClient,应该是IHttpClientFactory,或者在构造函数中使用它但将类添加为Typed HttpClient
  • 嗨,你是对的,这是我正在做的测试之一。我删除了 myClient,并仅依赖于此处 learn-blazor.com/architecture/dependency-injection 中所建议的 HttpClient 注入,但仍然无法正常工作。 Blazor 中似乎不支持 IHttpClientFactory。
  • @rekiem87,他没有在构造函数中使用 HttpClient。自己看代码。据我所知,Blazor 客户端尚不支持 Http Client Factory。
  • @etragu,请显示您的所有代码,以便我们尝试解决您的问题...
  • 嗨 Issac,基本上是这样,在构造函数上注入一个接收 HTTPClient 的服务,将其添加到 ConfigureServices,创建一个使用此服务的组件。
猜你喜欢
  • 2021-09-03
  • 1970-01-01
  • 1970-01-01
  • 2015-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-08
相关资源
最近更新 更多