我使用 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
|
namespace Server.Http.Controller { public abstract class BaseController: WebApiController { protected IContainer IoC { get; private set; }
protected LiteDBManager LiteDb { get; private set; }
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
|
namespace Server.Http.Controller { public class User : BaseController { [Route(HttpVerbs.Post, "/user/login")] public async Task<bool> UserLogin_1() { var Body = HttpContext.GetRequestDataAsync<User>(); return true; } [Route(HttpVerbs.Post, "/user/login")] public async Task<bool> UserLogin_2([FormData] NameValueCollection body) { return false; } [Route(HttpVerbs.Post, "/user/login")] public async Task<bool> UserLogin_1() { var Body = JObject.Parse(await HttpContext.GetRequestBodyAsStringAsync()); return true; } } }
|
上述三种方式,原则上都是可以的,但是实际的使用中,会有一些坑要注意:
坑1:
不要在 OnBeforeHandler
方法中尝试获取 body
的值,始终为空。
坑2:
方式1中的 User
在进行类的定义时,必须是可读可写的属性,而不能是字段,如果是字段,会出现赋值为空的情况。
坑3:
方式2的读取方法可以读到数据,但是读到的数据只有一个字符串,而不是字典,实际中无法使用。
综上所述,获取 request 中的 body
数据,上述三个方式都可以,但是使用时,要注意它们的使用条件。