背景:上一篇我用convention-based机制实现了RESTful service,这里我用Attribute Routing机制再实现一次。中间遇到的坑通过阅读combining-route-mappings-in-webapi找到了答案。
新增功能:Request通过Post完成,数据来自Request body,格式是raw (application/json)
code差异:
1. Startup.cs
using Owin;
using System.Web.Http;
using Microsoft.Owin.StaticFiles;
using Microsoft.Owin.FileSystems;
class Startup
{
//Note:这里只开启了Attribute Routing, convention Routing没开。
public void Configuration(IAppBuilder appBuilder)
{
// Configure Web API for self-host.
HttpConfiguration config = new HttpConfiguration();
config.MapHttpAttributeRoutes(); //Turn on Attribute Routing
//之前使用config.Routes.MapHttpRoute(...)这部分我移除了
appBuilder.UseWebApi(config);
}
}
2. MyController.cs
using System.Web.Http;
using System.Collections.Generic;
namespace demo
{
[RoutePrefix("api")]
public class MyController:ApiController //小心,必须public,否则Client会收到404错误
{
//之前convention-based机制下,Method是Get开头就能调用了
[Route("")]
[HttpGet]
public IEnumerable<string> AllProducts()
{
return new string[] { "value1", "value2" };
}
[HttpGet]
[Route("{id}")]
public string Product(int id)
{
return "haha";
}
//数据必须来自body,而且是raw 的application/json
[Route("AddInfo")]
[HttpPost]
async public void addInfo2Show()
{
string content = await this.Request.Content.ReadAsStringAsync();
//可以传给其他function了
}
//这里是用同步的方法获取Request里body的内容,与addInfo2Show()不同
//forums.asp.net/t/1772530.aspx?Making+a+request+synchronously
[Route("reboot")]
[HttpPost]
public string RebootOS()
{
string content = this.Request.Content.ReadAsStringAsync().Result;
return "{'Result':'Succeed'}";
}
}
}
3. 我是通过Postman来发送测试数据的。