it-swarm-ko.tech

기존 ASP.NET Core MVC에 웹 API 컨트롤러를 추가하는 방법은 무엇입니까?

기본 ASP.NET Core MVC 템플릿을 사용하여 프로젝트를 만들었습니다. /api/{Controller} 아래에 RESTful API를 만들고 싶습니다. 새 웹 API 컨트롤러 (표준 웹 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 Controller는 다음과 같습니다.

[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)
    {
    }
}
17
Alex G.

최신 버전의 ASP.NET Core v2.0.1 (VS2017이 필요한 버전)로 업데이트 한 후 문제가 해결되었습니다. 이전 버전의 버그 또는 단점 일 수 있습니다.

3
Alex G.

두가지.

첫째, 컨벤션 기반 라우팅을 사용하는 경우 경로 충돌을 피하기 위해보다 일반적인 경로가보다 일반적인 경로보다 우선해야합니다.

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
}
8
Nkosi

누군가 .net 코어 MVC에 webapi를 추가하는 데 여전히 문제가 있으면 클래스 앞에 [ApiController][Route("api/[controller]")] 속성을 삽입하여 문제를 해결하십시오.

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

Startup.cs에 경로 매핑을 추가하지 않았지만 여전히 잘 작동합니다. 사용중인 .net 버전은 2.1.402입니다.

3
Kevin Youn

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를 호출 할 수있었습니다.

1
Ricardo May

이름을 "관리자"로 설정하십시오.

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "Admin",
                template: "api/{controller=Admin}");
        });
0
William Han