C# 将API控制器添加到ASP.NET核心项目
这里是搭建和编辑的控制器C# 将API控制器添加到ASP.NET核心项目,c#,asp.net-web-api,asp.net-core-webapi,C#,Asp.net Web Api,Asp.net Core Webapi,这里是搭建和编辑的控制器 namespace TheAspNetCoreProject { [Route("api/TheApi")] [ApiController] public class TheApiController : ControllerBase { [HttpGet] public IActionResult GetInfo() { return Ok("Foo");
namespace TheAspNetCoreProject
{
[Route("api/TheApi")]
[ApiController]
public class TheApiController : ControllerBase
{
[HttpGet]
public IActionResult GetInfo()
{
return Ok("Foo");
}
}
}
我希望在/api/TheApi/
或/api/TheApi/Info
或/api/TheApi/GetInfo
上看到它,但什么都没有
脚手架没有对Startup.cs
做任何事情,但是没有提到,例如,在Startup.cs
中需要任何东西,这听起来不太可能
如何使其工作?默认情况下,Web API路由的定义如下:
API/{controller}
。请注意,没有{action}
存在
他们这样做是为了符合REST(代表性状态转移)的做事方式。它基于资源和动词的概念;通常获取、更新、发布、删除
因此,对于默认路线,这将匹配:
获取api/TheApi
namespace TheAspNetCoreProject
{
[Route("api/TheApi")]
[ApiController]
public class TheApiController : ControllerBase
{
public IActionResult Get()
{
return Ok("Foo");
}
}
}
当然,路由始终可以更改为更像RPC。默认情况下,Web API路由的定义如下:
API/{controller}
。请注意,没有{action}
存在
他们这样做是为了符合REST(代表性状态转移)的做事方式。它基于资源和动词的概念;通常获取、更新、发布、删除
因此,对于默认路线,这将匹配:
获取api/TheApi
namespace TheAspNetCoreProject
{
[Route("api/TheApi")]
[ApiController]
public class TheApiController : ControllerBase
{
public IActionResult Get()
{
return Ok("Foo");
}
}
}
当然,路由始终可以更改为更像RPC。我刚刚启动了VS,并从模板中执行了一个新的.net core Web Api项目,它的工作方式与您预期的工作方式相同:
[ApiController]
[Route("api/TheApi")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
}
[HttpGet]
public IEnumerable<WeatherForecast> Get()
{
var rng = new Random();
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = rng.Next(-20, 55),
Summary = Summaries[rng.Next(Summaries.Length)]
})
.ToArray();
}
[HttpGet("OtherGet")]
public IEnumerable<WeatherForecast> OtherGet()
{
var rng = new Random();
return Enumerable.Range(1, 2).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = rng.Next(-20, 55),
Summary = Summaries[rng.Next(Summaries.Length)]
})
.ToArray();
}
}
更新:还请记住,一个控制器中不能有多个GET/POST etc方法,除非您像我使用OtherGet:HttpGet(“OtherGet”)一样为其他(或所有)控制器使用注释。如果您不使用此批注,并且有多个GET、POST等方法,则会出现异常:
含糊不清的MatchException:请求匹配了多个端点。
我刚刚启动了VS,并从模板中创建了一个新的.net core Web Api项目,它按照您的预期工作:
[ApiController]
[Route("api/TheApi")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
}
[HttpGet]
public IEnumerable<WeatherForecast> Get()
{
var rng = new Random();
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = rng.Next(-20, 55),
Summary = Summaries[rng.Next(Summaries.Length)]
})
.ToArray();
}
[HttpGet("OtherGet")]
public IEnumerable<WeatherForecast> OtherGet()
{
var rng = new Random();
return Enumerable.Range(1, 2).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = rng.Next(-20, 55),
Summary = Summaries[rng.Next(Summaries.Length)]
})
.ToArray();
}
}
更新:还请记住,一个控制器中不能有多个GET/POST etc方法,除非您像我使用OtherGet:HttpGet(“OtherGet”)一样为其他(或所有)控制器使用注释。如果不使用此批注并且具有多个GET,POST etc方法您将遇到异常:
含糊不清的MatchException:请求匹配多个端点。
经过许多非常不愉快的尝试和错误后,我现在可以报告,确实需要更新的是Startup.cs
——webAPI控制器没有更新它
在我的
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider serviceProvider)
我有
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
它需要改成
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
endpoints.MapControllers(); // Added for webAPI.
});
在经历了许多非常不愉快的尝试和错误之后,我现在可以报告说,确实需要更新的是
Startup.cs
——webAPI控制器没有更新它
在我的
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider serviceProvider)
我有
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
它需要改成
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
endpoints.MapControllers(); // Added for webAPI.
});
所以,这正是OP所说的:“我们希望在/api/TheApi/上看到它。”“默认情况下,Web api路由的定义是这样的:api/{controller}“对于ASP.NET Core来说这不是真的,你只是删除
[HttpGet]
并重命名操作,希望它能工作?@RomanMarusyk没有看到它是针对Core的;是的,但问题是关于dotnet Core 3.1So的,这正是OP所说的:“我们希望在/api/TheApi/”默认情况下,Web api路由是这样定义的:api/{controller}“这对ASP.NET Core不是真的,您只需删除[HttpGet]
并重命名操作,希望它能工作?@RomanMarusyk没有看到它是用于核心的;是的,但问题是关于dotnet Core 3.1如何显示您的启动文件如何显示您的启动文件这是个好主意--启动一个新的webAPI项目。事实上,我发现的Startup.cs
之间的区别显而易见。很高兴听到,如果答案对您有帮助,请接受:)还要记住,您不能在一个控制器中有多个get/post etc方法,除非您像我对OtherGet:HttpGet(“OtherGet”)那样对其他(或所有)方法使用注释。如果不使用此注释,并且有多个GET、POST等方法,则会出现异常:AmbiguousMatchException:请求匹配了多个端点。这是个好主意--启动一个新的webAPI项目。事实上,我发现的Startup.cs
之间的区别显而易见。很高兴听到,如果答案对您有帮助,请接受:)还要记住,您不能在一个控制器中有多个get/post etc方法,除非您像我对OtherGet:HttpGet(“OtherGet”)那样对其他(或所有)方法使用注释。如果不使用此注释,并且有多个GET、POST等方法,则会出现异常:AmbiguousMatchException:请求匹配了多个端点;在我的配置中,当我执行localhost:8090/WeatherForecast时,我得到404;在我的configure中,当我执行localhost:8090/WeatherForecast时,我得到404。