ASP.NET核心WebAPI路由

时间:2018-03-20 00:15:12

标签: c# asp.net-core

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

2 个答案:

答案 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