首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Blazor:获取“`ActionContext`”

Blazor:获取“`ActionContext`”
EN

Stack Overflow用户
提问于 2020-08-25 21:50:40
回答 1查看 227关注 0票数 0

我正在将脚手架的ASP.Net标识页从Razor页面转换为Blazor。我遇到了麻烦,希望你能帮忙。ChallengeResult.ExecuteResultAsync需要一个ActionContext实例。在服务器端Blazor应用程序中是否存在这样的实例,我如何才能获得它?

编辑

代码语言:javascript
复制
An unhandled exception occurred while processing the request.
InvalidOperationException: Cannot provide a value for property 'ActionContextAccessor' on type 'OCR.UI.Site.Pages.Account.ExternalLogin'. There is no registered service of type 'Microsoft.AspNetCore.Mvc.Infrastructure.IActionContextAccessor'.

Microsoft.AspNetCore.Components.ComponentFactory+<>c__DisplayClass5_0.<CreateInitializer>g__Initialize|2(IServiceProvider serviceProvider, IComponent component)

不是joy。

EN

回答 1

Stack Overflow用户

发布于 2022-11-17 15:35:51

顾名思义,ActionContext也涉及到MVC,特别是“动作”,这些方法可以通过正确地寻址控制器的端点来调用控制器。

在MVC应用程序中,如果将一个ActionContext对象注册到DI容器并尝试访问它的值,则可以获得当前的IActionContextAccessorActionContext描述哪个控制器的操作被击中,哪些参数通过路由和模型绑定绑定。

然而,在MVC中,并不总是有ActionContext。在MVC应用程序的过程中,您可能有不一定由MVC控制器的操作触发的其他代码。这可能是您为发送电子邮件而运行的一些后台进程、用于与客户端进行实时通信的SignalR集线器、gRPC或在应用程序中运行的另一个线程,这些线程没有处理传入的HTTP请求。您甚至可能在HTTP管道中,但不是MVC!如果您有一个为HTTP响应服务的中间件,则不会有一个ActionContext。因此,访问器模式。如果您没有ActionContext,则该值将为空。

在Blazor中,在页面的初始呈现过程中或在执行static呈现时,您只有一个HTTP请求(本质上是当您使用<component render-mode="Static">时,它呈现一个非交互式的Blazor组件,本质上是作为字符串进入HTTP)。出于这个原因,从不建议使用ActionContext,即使访问器可以在Blazor中使用。当用户输入页面的完整URL时,您将得到一个ActionContext。但是一旦用户将in-app导航到同一页面,就不会有任何HTTP通信产生于该导航。

简而言之,在Blazor中,即使您可以访问ActionContext,也不要使用它,因为它的设计很糟糕,从另一个Blazor组件导航到该页面时它将无法工作。

对于您的具体问题,您必须调用标识框架的不同低级API(比如检查用户密码),而不是依赖HTTP。在Blazor中,您的代码已经在服务器上运行,与客户端进行实时连接,响应客户端的交互。例如,您不能像在MVC中那样“放下cookie”,因为没有HTTP响应来发送Set-Cookie头。因此,您需要一个执行完全回发的服务器端呈现解决方案和一个处理传入请求的服务器。这本质上是Razor (或MVC)。正因为如此,没有一种直接或开箱即用的方法来简单地迁移身份脚手架页面“逐页”。这些交互必须重新定位,以便与Blazor兼容,或者在很少的情况下它们不兼容(通常需要设置或读取服务器可读的cookie),您可以在Blazor、Razor页面中使用上述的static呈现模式,或者使用其他客户端逻辑(如JavaScript)来处理表单的投递或完全回发导航到URL。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63587602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档