Skip to main content
 首页 » 编程设计

c#之ASP.NET Core Web API 路由

2024年01月29日29lidabo

我正在使用 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 请求。