EmbedIO获取request中的body数据

我使用 EmbedIO 搭建了一个 web 服务,使用 WebApiController 提供路由服务。在使用中,为了获取 request 中的 Body 数据,踩了一些坑,作此记录。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// BaseController.cs
// 自定义所有 controller 的基类
namespace Server.Http.Controller
{
public abstract class BaseController: WebApiController
{
protected IContainer IoC { get; private set; }

protected LiteDBManager LiteDb { get; private set; }

/// <summary>
/// 获取控制数据库操作类
/// </summary>
protected override async void OnBeforeHandler()
{
IoC = HttpContext.GetIoCScope();
LiteDb = IoC.Get<LiteDBManager>();

base.OnBeforeHandler();
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// User.cs
// User相关的API
namespace Server.Http.Controller
{
public class User : BaseController
{
// 方式1
[Route(HttpVerbs.Post, "/user/login")]
public async Task<bool> UserLogin_1()
{
var Body = HttpContext.GetRequestDataAsync<User>();
return true;
}

// 方式2
[Route(HttpVerbs.Post, "/user/login")]
public async Task<bool> UserLogin_2([FormData] NameValueCollection body)
{
return false;
}

// 方式3
[Route(HttpVerbs.Post, "/user/login")]
public async Task<bool> UserLogin_1()
{
// 读取jsonData
var Body = JObject.Parse(await HttpContext.GetRequestBodyAsStringAsync());
return true;
}
}
}

上述三种方式,原则上都是可以的,但是实际的使用中,会有一些坑要注意:

坑1:

不要在 OnBeforeHandler 方法中尝试获取 body 的值,始终为空。

坑2:

方式1中的 User 在进行类的定义时,必须是可读可写的属性,而不能是字段,如果是字段,会出现赋值为空的情况。

坑3:

方式2的读取方法可以读到数据,但是读到的数据只有一个字符串,而不是字典,实际中无法使用。

综上所述,获取 request 中的 body 数据,上述三个方式都可以,但是使用时,要注意它们的使用条件。