如何将 Web API 控制器添加到现有的 ASP.NET Core MVC?

Posted

技术标签:

【中文标题】如何将 Web API 控制器添加到现有的 ASP.NET Core MVC?【英文标题】:How to add Web API controller to an existing ASP.NET Core MVC? 【发布时间】:2017-07-04 22:30:43 【问题描述】:

我使用默认的 ASP.NET Core MVC 模板创建了一个项目。我还想在/api/Controller 下创建一个 RESTful API。我添加了一个新的 Web API 控制器(标准 Web API 控制器类模板),但我不能调用它。我收到一条错误消息,提示找不到该页面。我尝试在 Startup.cs 中添加一条路线,但它什么也没做:

app.UseMvc(routes =>

    routes.MapRoute(name: "default", template: "controller=Home/action=Index/id?");
    routes.MapRoute(name: "api", template: "api/controller=Admin");
);

编辑:

就像我说的,这都是默认模板。这是我添加的 Web API 控制器:

[Route("api/[controller]")]
public class AdminController : Controller
                
    // GET api/values/5
    [HttpGet("id")]
    public string Get(int id)
    
        return "value";
    

    // POST api/values
    [HttpPost]
    public void Post([FromBody]string value)
    
    

    // PUT api/values/5
    [HttpPut("id")]
    public void Put(int id, [FromBody]string value)
    
    

    // DELETE api/values/5
    [HttpDelete("id")]
    public void Delete(int id)
    
    

【问题讨论】:

嗯,我不在我的家用电脑上,所以我可能错了,但我认为您不需要为 API 添加新路由。我认为你只是从 APIController 基类继承,并从中派生出你自己。那么 MVC 应该为你做路由。此时,在您的路由中,您唯一拥有的就是您的默认路由,MVC 将为您处理 API 路由。 这就是我的想象,但导航到 localhost:27891/api/Admin 会导致 ERR_CONNECTION_REFUSED。 docs.microsoft.com/en-us/aspnet/web-api/overview/… 向下滚动到 ProductsController 大约一半。它继承自 ApiController,而不是控制器。 那是旧的。他们合并了 Controller 和 ApiController 所以现在两者之间没有真正的区别:***.com/questions/32353866/… 【参考方案1】:

两件事。

首先,在使用基于约定的路由时,更具体的路由应位于更通用的路由之前以避免路由冲突。

app.UseMvc(routes =>

    routes.MapRoute(name: "api", template: "api/controller=Admin");
    routes.MapRoute(name: "default", template: "controller=Home/action=Index/id?");
);

其次,您已经在控制器上使用属性路由,因此应该能够路由到控制器,除非您在控制器上没有可以接受/api/Controller的路由模板

这需要一个默认路由。

[Route("api/[controller]")]
public class AdminController : Controller 
 
    [HttpGet("")] //Matches GET api/admin <-- Would also work with [HttpGet]
    public IActionResult Get() 
        return Ok();
    

    [HttpGet("id")] //Matches GET api/admin/5
    public IActionResult Get(int id) 
        return Ok("value");
        

    //...other code removed for brevity

【讨论】:

我的第一个意图是不要触及 app.UseMvc 中的路由。但是,开箱即用,它不起作用。 [Route("api/[controller]")] 是不够的。我确实遵循了您的建议,并在通用路线之前添加了特定路线,就像上面一样。如果我尝试导航到localhost:27891/api/Admin,它仍然不起作用。令人惊讶的是,如果我转到localhost:27891/[WHATEVER],它会触发 AdminController 中的 Get() 方法并将 [WHATEVER] 作为参数传递。这真的很奇怪。【参考方案2】:

我很幸运在 v3.1 中做到了这一点:

将文件夹 Controllers 添加到项目中。将名为 TestController 的 Controller 添加到文件夹中。 然后将以下内容添加到 Startup.cs:

services.AddControllers();

public void ConfigureServices(IServiceCollection services)
    
        services.AddRazorPages();
        services.AddControllers();
    

和:

endpoints.MapControllers();

app.UseEndpoints(endpoints =>
        
            endpoints.MapRazorPages();
            endpoints.MapControllers();
        );

然后我就可以调用 /api/Test。

【讨论】:

这对我有用!使用我现有的项目,我创建了模板 dot net core API 项目并将控制器和类复制过来,这两行代码是唯一缺少的其他内容。 在 dotnetcore v5.0 中为我工作【参考方案3】:

如果有人在将 webapi 添加到 .net core MVC 中仍然存在问题,只需在 class 之前插入 [ApiController][Route("api/[controller]")] 属性即可解决问题:

[Route("api/[controller]")]
[ApiController]
public class ListController
 ... 

我没有在Startup.cs 中添加路由映射,并且仍然运行良好。我使用的 .net 版本是 2.1.402

【讨论】:

【参考方案4】:

更新到最新版本的ASP.NET Core v2.0.1(需要VS2017的那个)后,问题自行解决。我认为这可能是旧版本的错误或缺点。

【讨论】:

【参考方案5】:

尝试将名称设置为“管理员”

        app.UseMvc(routes =>
        
            routes.MapRoute(
                name: "Admin",
                template: "api/controller=Admin");
        );

【讨论】:

不起作用。文档说路由的名称并不重要,除了 URL 生成。

以上是关于如何将 Web API 控制器添加到现有的 ASP.NET Core MVC?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 .net core Web API 项目添加到现有的 .NET core (3.1) Web Application 项目中?

将角色属性添加到现有的 MVC 5 Web 应用程序

将捆绑包添加到现有的 ASP.NET Webforms 解决方案

将 Angular 和 .net core web api 安全地集成到现有的 MVC 5 应用程序中

将 jQuery 集成到现有的 ASP.NET Web 应用程序中?

如何将 Oauth2.0 合并到现有的 Java Spring Web MVC 和 REST 项目中?