【问题标题】:"Scoped" service's constructor getting called more than once“作用域”服务的构造函数被多次调用
【发布时间】:2019-11-26 00:29:17
【问题描述】:

我们有 Blazor 应用程序,我们在其中配置生命周期范围设置为“Scoped”的服务。出于某种原因,该服务的构造函数被多次调用。有谁知道为什么?

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
    services.AddScoped<IProjectClient, ProjectClient>();
}

ProjectClient 的构造函数被多次调用。有什么想法/建议吗?

【问题讨论】:

  • 按请求调用范围内的服务 (HTTP)。您是否在 Web 请求的范围内多次调用它们? docs.microsoft.com/en-us/aspnet/core/fundamentals/…
  • 是的,每个请求不止一次。
  • 当用户在页面上执行某些操作时会发生“调用”吗?
  • 如何检查构造函数被多次调用每个请求?您如何识别一个请求的边界?
  • 注射在哪里?

标签: c# dependency-injection .net-core asp.net-core-2.0 blazor


【解决方案1】:

是的,它被调用了两次,因为您使用的是预渲染。转到_Host.cshtml 并将render-mode="ServerPrerendered" 设置为render-mode="Server",它只会被调用一次。

【讨论】:

  • 如果我使用“服务器”作为渲染模式,来自依赖注入的 IHttpContextAccessor 的 HttpContext 始终为空。为什么会这样?
  • 它与渲染模式无关...您无法访问 Blazor 服务器应用程序中的 HttpContext(在 WebAssembly 应用程序中不用说),因为它不可用。至少大部分时间。这是因为 Server Blazor 与其客户端之间的通信是使用 SignaleR 完成的。你不应该使用 IHttpContextAccessor。
  • 我们仅在 blazor 服务器端客户端中使用 httpcontext。如果使用 ihttpcontextaccessor 没有问题,我们如何在 blazor 服务器端客户端获取当前登录的用户名?任何指针?感谢您的回复。
  • 这里需要澄清一下:Blazor 服务器应用程序或服务器端 Blazor 是用于描述在服务器上执行的应用程序的术语。 WebAssembly App 或客户端 Blazor 是在客户端上执行的 Blazor App;也就是浏览器。当我说“Server Blazor 及其客户端”时,客户端代表浏览器。更准确地说,我指的是屏幕上显示的 Html 文档,以及与驻留在服务器上的 Blazor 服务器端应用程序通信的 JavaScript SignaleR 代码。
  • 感谢您的澄清。我们正在使用来自服务器端 Blazor 的 httpcontext。有趣的是,我们在第一个请求中得到了正确的 httpcontext,但对于所有后续请求,它都是空的。我们要做的就是将当前 Windows 登录用户的名称 (HttpContext.User.Identity.Name) 存储到一个变量中并将其传递给服务。只是好奇,我如何才能第一次访问 httpcontext?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多