Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将Web API控制器添加到现有ASP.NET核心MVC?_C#_Asp.net Core_Asp.net Core Mvc_Asp.net Core Webapi_Asp.net Core Routing - Fatal编程技术网

C# 如何将Web API控制器添加到现有ASP.NET核心MVC?

C# 如何将Web API控制器添加到现有ASP.NET核心MVC?,c#,asp.net-core,asp.net-core-mvc,asp.net-core-webapi,asp.net-core-routing,C#,Asp.net Core,Asp.net Core Mvc,Asp.net Core Webapi,Asp.net Core Routing,我使用默认的ASP.NET核心MVC模板创建了一个项目。我还想在/API/{Controller}下创建一个RESTful API。我添加了一个新的WebAPI控制器(标准WebAPI控制器类模板),但我不能调用它。我收到一个错误,说找不到该页。我尝试在Startup.cs中添加路由,但它没有做任何操作: app.UseMvc(routes => { routes.MapRoute(name: "default", template: "{controller=Home}/{act

我使用默认的ASP.NET核心MVC模板创建了一个项目。我还想在
/API/{Controller}
下创建一个RESTful API。我添加了一个新的WebAPI控制器(标准WebAPI控制器类模板),但我不能调用它。我收到一个错误,说找不到该页。我尝试在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)
    {
    }
}
尝试将名称设置为“Admin”

两件事

首先,当使用基于约定的路由时,更具体的路由应该优先于更一般的路由,以避免路由冲突

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
}
[路由(“api/[控制器]”)]
公共类AdminController:Controller{

[HttpGet(“”)///Matches GET api/admin在更新到最新版本的ASP.NET Core v2.0.1(需要VS2017的版本)后,问题自行解决。我认为这可能是旧版本中的错误或缺陷。

如果有人在将webapi添加到.NET Core MVC时仍然有问题,只需插入
[ApiController]
[路由(“api/[控制器]”)]
类解决问题之前的属性:

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

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

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

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

services.AddControllers();

以及:


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

嗯,我不在我的家用电脑上,所以我可能错了,但我认为你不需要为api添加新的路由。我认为你只需要从APIController基类继承,并从中派生出你自己的路由。然后MVC应该为你做路由。此时,在你的路由中,你唯一拥有的就是你的默认路由ng和MVC将为您处理API路由。这是我想象的,但导航到会导致错误连接被拒绝。向下滚动大约一半到ProductsController。它继承自ApiController,而不是controller。这很旧。它们合并了controller和ApiController,所以现在两者之间没有真正的区别:我的第一个意图我的建议是不要接触app.UseMvc中的路由。但是,开箱即用,它不起作用。[Route(“api/[controller]”)是不够的。我确实按照你的建议,在通用路由之前添加了特定路由,如上所述。如果我尝试导航到它,它仍然不起作用。令人惊讶的是,如果我转到它,会触发Get()方法并传递[WHATEVER]作为一个论点。这真的很奇怪。不起作用。文档中说,除了URL生成之外,路由的名称并不重要。这对我来说很有效!使用我现有的项目,我创建了模板dot net core API项目,并复制了控制器和类,这两行代码是唯一缺少的东西。Wor在dotnetcore v5.0中为我设计
services.AddControllers();
public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
        services.AddControllers();
    }
endpoints.MapControllers();
app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
            endpoints.MapControllers();
        });