我用模拟工具发一个post请求到core 2.0 webapi项目的一个接口上:
接口里的代码如下:
[HttpPost] public string Post() { int i = int.Parse("qqq"); return "Hello World!"; }
故意抛了一个错,触发了异常过滤器,异常过滤器调了下面这个GetPostParams方法,初衷是想记录该请求的所有参数:
模拟提交的时候,POST一个参数都没带,context.Request.Form点出来的任何方法都报错,发一个带参数的POST试试:
走你:
不报错了,也可以拿到参数。现在问题来了,ASP.NET Core的webapi项目里,不带请求参数的时候,如何通过代码判断出来该POST请求不带参数,同时不报错?
context.Request.Form.Count在没有POST参数的时候都会报错,大家试一下。
注:Core webapi项目,非ASP.NET MVC项目。
我用下面的代码测试没有报错
if(Request.Form.Count > 0 && Request.Form.Keys.Count > 0)
{
return Ok("Request.Form.Keys: " + Request.Form.Keys.Count);
}
你说奇怪不奇怪吧:
@oppoic: 对于 web api ,请求时应该用 x-www-form-urlencoded
,不应该用 form-data
@dudu: 按你说的是可以了,但是为何form-data方式,有值Request.Form.Count可以获取个数,没值连0都不输出,直接报错,这是为啥。
@oppoic: 如果想知道究竟,可以看 ASP.NET Core 的源代码:https://github.com/aspnet/Mvc
context.Request.Form.Count你确定这是在获取post过来的参数数量吗?看写法貌似是判断form个数
我猜:如果没有任何POST参数的话,Request.Form这个集合就不会被初始化,所以,,,,。
如果只是判断post有没有参数,可以通过Request.ContentLength 来判断,
但如果content中有内容,却不是可以解析为form的参数,Request.Form还是会抛异常!这样的话,你只能靠捕获异常来处理。
我现在不清楚是否有指示标志或其他方式来处理你这个想法。
其实,你是可以获取Request content中的内容,自己来实现解析的逻辑,然后就可以很方便的实现你的需求了。
楼上的dudu回复是正确的:
如果POST请求指定了编码方式是“x-www-form-urlencoded”,那么就算POST请求过来没有带参数,Request.Form也不会报错,如果POST编码方式是“form-data”,同时POST请求没有参数的话,那么Request.Form也会报错。
但是我不能控制前端发请求的编码方式,所以还是按照你的方式,通过Request.ContentLength判断一下,这样就完美了,无论那种编码方式的POST请求过来都可以了,最终代码:
if (context.Request.ContentLength != 0) { foreach (var key in context.Request.Form.Keys) { param += key + ":" + context.Request.Form[key].ToString() + " "; } }