我正在使用ASP.NET Core创建API,下面是我的控制器代码。
我已经给出了下面的控制器和启动代码,以及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://docs.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();
}
以下是我的小提琴请求:
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
答案 0 :(得分:5)
[Route("api/[controller]")]
以及操作中的[HttpPost]
表示该操作将在/api/[controller]
处可用。所以在你的情况下/api/User
。
除非在路径模板中包含[action]
,否则路径中不会包含操作的方法名称。
因此,尝试POST /api/User
,或将控制器上的路由属性更改为[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)。相反,你必须故意将你的方法暴露为带动词的实际路线。
在您的exapmle中,您的UserController
可能是“用户”资源。因此,注册用户可能是对/api/User
的POST请求。
答案 1 :(得分:0)
您还没有完全明确路线。
[Route("api/[controller]")]
会创建网址的/api/User
部分,但您尚未在行动中指定其余路线。
因此,您的请求应从http://localhost:8011/api/User/RegisterUser
更改为http://localhost:8011/api/User