从 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
(因此它不会使用 CookieContainer
和 NOT 主动忽略Cookie
标头)。这种方式真的很酷,我们对 OP 的原始问题有一个完美的解决方案。以上是关于从 MVC 控制器动作调用 APIController 动作的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 jQuery 调用 MVC ChildActionOnly 控制器动作