首页 > 解决方案 > 在同一个控制器中混合 MVC 和 API

问题描述

我有一个 ASP.NET Core MVC 项目,当我部署并与另一个人一起尝试时,网站冻结并超时。

当我们开始项目时,我们创建了 MVC 控制器并且一切正常。然后我们需要有一些前端的数据源,我们在MVC的同一个控制器中包含“API”(注意引号)方法。然后问题开始出现。

最近我们将项目部署在生产中,我请人帮我测试和发现错误。我们连接,当我们加载主页时,JS API 调用超时。首先,我怀疑 Web 后端所做的服务调用,但经过一些调试,事实并非如此。

阴暗的事情是在当地(而且是单独的),一切都完美无缺。所以我需要在测试中进行更深入的测试,我要求其他测试人员与我同时加载主页,另一方面我启动 Postman 来调用网站的“API”端点。视图完美呈现,JS 调用 API 并在 15 秒后超时,在 Postman 中,请求永远找不到响应。

结论和提问时间,我发现当多个连接使用控制器时,API 调用似乎被阻塞了。经过几次谷歌搜索,我发现在 ASP.NET Core 2.x 中,MVC 和 API 没有扩展相同的基本代码,MVC 扩展了 Controller 因为它支持 Views 而 API 扩展了 ControllerBase,这与不支持 Views 的 Controller 相同。许多人说 MVC 和 API 控制器必须是 2 个不同的控制器。

但是,这并不能回答我的基本问题,为什么当有超过 1 个用户使用该网站时,MVC 控制器中的 API 调用会中断?为什么 MVC 控制器不能处理 API 端点?这是因为意见吗?

希望我让我的想法清楚,因为除了应用人们(和我认为的文档)所说的内容之外,我还想得到一个答案。

编辑:这里是现在的样本

public FooController : Controller 
{
    [HttpGet]
    public IActionResult Index()
    {
        return View();
    }

    [HttpGet]
    public IActionResult GetData()
    {
        return StatusCode(200, new { value = 1 });
    }
}

索引正确呈现并且调用https://example.com/Foo/GetData超时或当超过 1 个用户使用该网站时永远找不到响应。

路线配置:

applicationBuilder.UseMvc(routes =>
{
    routes.MapRoute(name: "cultureRoute",
        template: "{culture}/{controller}/{action}/{id?}",
        defaults: new { controller = "Logon", action = "Index" },
        constraints: new
        {
            culture = new RegexRouteConstraint("^[a-z]{2}(?:-[A-Z]{2})?$")
        });

        routes.MapRoute(name: "default", template: "/{controller=Logon}/{action=Index}/{id?}");
});

1 天后,我找到了问题的根源,我们使用 SignalR 在用户之间同步数据,由于某种未知原因,当我禁用 SignalR 时,任何连接的用户都可以正常工作。那么,SignalR 如何在某个时刻阻止对 API 的所有请求呢?

标签: c#ajaxasp.net-core-mvc

解决方案


推荐阅读