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的主要内容,如果未能解决你的问题,请参考以下文章

将json参数发布到api使用post方法Swift 3

如何使用 Swifty Json 将 POST 请求中的 JSON 数据保存到字典中?

无法使用 Netty 将 JSON POST 到服务器

使用 jQuery 将 JSON POST 到 Laravel 4

将字典嵌套到 JSON 以用于 POST 请求 Python

使用 alamofire 将带有 JSON 对象和查询参数的 POST 请求发送到 REST Web 服务