从 MVC 控制器动作调用 APIController 动作

Posted

技术标签:

【中文标题】从 MVC 控制器动作调用 APIController 动作【英文标题】:Calling APIController action from MVC controller action 【发布时间】:2021-04-22 02:06:47 【问题描述】:

我正在尝试使用 httpclient 对象从 MVC 控制器中使用 API 操作方法, 但我面临的问题是我无法访问会话用户的声明,因为用户始终为空here is the calling of api method from mvc method you can notice the session user always null

拜托我卡住了,我需要你的帮助来克服

【问题讨论】:

您应该重构您的 API 以使控制器(或 Web 前端 api)使用内部 api(通过基于令牌授权的 Web api 公开 - 而不是 cookie)。这样你就可以正常使用api了。否则(您当前的设计),您有 2 个选项:(1)沿请求传递 cookie - 正如我在下面第一个答案下的评论中指出的那样,这效率不高。 (2) 重定向请求——这仍然需要你稍微重构你的 api/services(但不像我开头提到的那样)。 【参考方案1】:

在以下教程之一中检查身份的工作方式:https://www.tektutorialshub.com/asp-net-core/asp-net-core-identity-tutorial/

我们正在调用 PasswordSignInAsyncto 验证并发出身份验证 cookie

您应该提供一个带有身份验证值的 cookie,以便调用可以识别目标用户并使用适当的值初始化当前用户对象。

您可以在此处找到添加 cookie 的示例:How do I set a cookie on HttpClient's HttpRequestMessage

请提供一些代码和身份验证实现细节,以便我们为您提供更多帮助。

【讨论】:

我相信像这样的请求发送cookie需要我们为每个请求设置CookieContainer(在发送之前)。所以在使用 shared HttpClientHandler 时会出现问题,建议在使用 HttpClient 时使用。如果不共享客户端处理程序,我们总是必须为每个请求创建一个新的HttpClientHandler(带有单独的CookieContainer),这最终将可能耗尽所有套接字连接。所以我认为我们只能转发标头值(意味着端点必须支持某种基于令牌的授权)。 如果只传播标头(例如:Authorization 标头,...)以帮助传播身份和授权,我们可以使用名为 Header propagation middleware docs.microsoft.com/en-us/aspnet/core/fundamentals/… 的内置中间件/跨度> 我认为您应该通过不使用CookieContainer 而是发送Cookie 的标头以及从当前请求上下文中克隆的cookie 来更新您的答案。 HttpClientHandler 然后 必须UseCookies 设置为 false (因此它不会使用 CookieContainerNOT 主动忽略Cookie 标头)。这种方式真的很酷,我们对 OP 的原始问题有一个完美的解决方案。

以上是关于从 MVC 控制器动作调用 APIController 动作的主要内容,如果未能解决你的问题,请参考以下文章

MVC如何从视图调用控制器中的动作以返回值

从控制器动态渲染动作 - MVC

从 ajax 获取数据到 mvc 动作

如何使用 jQuery 调用 MVC ChildActionOnly 控制器动作

超链接 MVC - 动作方法如何知道她在调用时位于哪个控制器中

从按钮单击调用MVC Razor Ajax