POST JSON 到 ActionFilterAttribute
Posted
技术标签:
【中文标题】POST JSON 到 ActionFilterAttribute【英文标题】:POST JSON to ActionFilterAttribute 【发布时间】:2021-12-29 02:07:52 【问题描述】:我正在用 C# .Net4.8 编写客户端和 API。我正在从客户端发布数据,并且在端点方法上有一个ActionFilterAttribute
。我想在ActionFilterAttribute
方法中读取发布的数据。我发现我能够使用FormUrlEncodedContent
POST 表单数据并且它被接收,但是当我尝试使用stringContent
POST JSON 数据时它没有被接收。
如何更改我的客户端代码或 API 代码以正确地 POST JSON?
像这样发布表单数据:
HttpClientHandler handler = new HttpClientHandler()
HttpClient httpClient = new HttpClient(handler);
FormUrlEncodedContent formString = new FormUrlEncodedContent(data);
response = httpClient.PostAsync(url, formString).Result; // run synchronously
然后在 API 端,dataFromClient
被填充:
public class myFilter : ActionFilterAttribute
public string Feature get; set;
public myFilter(string feature)
this.Feature = feature;
public override void OnActionExecuting(ActionExecutingContext filterContext)
string dataFromClient = (HttpContext.Current.Request.Params["dataFromClient"] == null) ? "" : HttpContext.Current.Request.Params["dataFromClient"];
// do other stuff with dataFromClient here
这样 POST JSON 数据不起作用:
HttpClientHandler handler = new HttpClientHandler()
HttpClient httpClient = new HttpClient(handler);
StringContent stringContent = new StringContent(jsonString, System.Text.Encoding.UTF8, "application/json");
response = httpClient.PostAsync(url, stringContent).Result; // run synchronously
使用此方法,API 中的dataFromClient
为空。
【问题讨论】:
【参考方案1】:由于您发布的是application/json
,因此您应该阅读请求正文。我想,这就是你想要的;
public override void OnActionExecuting(ActionExecutingContext filterContext)
var request = filterContext.HttpContext.Request;
var initialBody = request.Body;
try
request.EnableRewind();
using (StreamReader reader = new StreamReader(request.Body))
string dataFromClient = reader.ReadToEnd();
// do other stuff with dataFromClient here
return dataFromClient;
finally
request.Body = initialBody;
filterContext.Request.Body.Position = 0
return string.Empty;
【讨论】:
我确实将其视为其他 SO 问题的解决方案,我尝试过,但var initialBody = request.Body;
行无法编译 - 可能是因为我使用的是 .net4.8?它给了我错误“'HttpRequestBase'不包含'Body'的定义”以上是关于POST JSON 到 ActionFilterAttribute的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Swifty Json 将 POST 请求中的 JSON 数据保存到字典中?
使用 jQuery 将 JSON POST 到 Laravel 4