我正在使用 ASP.NET Core 创建一个 API,下面是我的 Controller 代码。
我在下面给出了 Controller 和启动代码,以及 fiddler 请求/响应日志。我收到 404 Not Found 错误。请告知我缺少什么?
[Route("api/[controller]")]
public class UserController : Controller
{
[HttpPost]
public string RegisterUser(User newUser)
{
// Code to register user in system
return succecss/failure message
}
}
我尝试了建议的属性路由 https://learn.microsoft.com/en-us/aspnet/core/mvc/controllers/routing但仍然没有运气。我不确定我错过了什么。
请注意,对于 Web API 模板,Startup.cs 中没有默认路由:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseMvc();
}
以下是我的 fiddler 请求:
URL: http://localhost:8011/api/User/RegisterUser
Verb= post
User-Agent: Fiddler
Host: localhost:8011
Content-Type: application/json
Content-Length: 77
Request body
{"FirstName": "TEST FirstName", "LastName": "Test Last Name", "EmailId":"A@BB.COM","Password":"1"}
Output in response header:
HTTP/1.1 404 Not Found
请您参考如下方法:
Controller 上的
[Route("api/[controller]")] 以及操作上的 [HttpPost] 意味着该操作将在/api/[ Controller ]。所以在你的情况下 /api/User.
除非您在路由模板中包含 [action],否则 Action 的方法名称将不会包含在路由中。
因此,尝试对 /api/User 进行 POST,或者将 Controller 上的路由属性更改为 [Route("api/[controller]/[action]")].
请注意,API 项目模板不在 Startup 中包含默认路由的原因是,对于 API,您需要明确配置它们。这样,路由就是您的应用程序设计的一部分。用RESTful API,您通常以表示“资源”的方式设计 API。然后您使用 HTTP 动词来指示您实际在做什么。包含的 ValuesController 实际上是一个很好的例子:
// GET api/values
[HttpGet] Get()
// => Get all values
// GET api/values/5
[HttpGet("{id}")] Get(int id)
// => Get a single value
// POST api/values
[HttpPost] Post([FromBody] string value)
// => Add a new value
// PUT api/values/5
[HttpPut("{id}")] Put(int id, [FromBody] string value)
// => Set/replace a value
// DELETE api/values/5
[HttpDelete("{id}")] Delete(int id)
// => Delete a value
默认情况下没有任何路由,您不会意外地在路由中以方法名称结束(因为方法名称通常是命令式单词组合,使其更像是 RPC 而不是 REST)。相反,您将不得不故意将您的方法公开为带有动词的实际路由。
在您的示例中,您的 UserController 可能用于“用户”资源。因此,注册用户可能是对 /api/User 的 POST 请求。
