【问题标题】:How to catch and save json data posted to restful asp.net web api如何捕获并保存发布到 restful asp.net web api 的 json 数据
【发布时间】:2014-10-16 05:38:21
【问题描述】:

我有这个代码:

[Route]
    public HttpResponseMessage PostData[FromBody] DataModel data)
    {
         ... implementation...
    }

这会自动将 json 数据绑定/转换为我的数据模型。但是,我想保存/捕获发布的原始 json 文件并将其保存以用于记录目的。 关于如何实现这一目标的任何建议?

【问题讨论】:

    标签: c# asp.net json asp.net-web-api


    【解决方案1】:

    您可以只执行以下操作,然后使用 JSON 转换器将字符串转换为 JSON。

    [HttpPost]
    public HttpResponseMessage PostData([FromBody] string text)
    {
       // log text.
        DataModel data = JsonConvert.DeSerialize<DataModel>(text);
    }
    

    或者你也可以这样做,

    [HttpPost]
    public HttpResponseMessage PostData()
    {
        string text = Request.Content.ReadAsStringAsync().Result; 
        //log text           
        DataModel data = JsonConvert.DeSerialize<DataModel>(text);
    }
    

    由于您提到它用于日志记录,您可能需要考虑在 Web API 过滤器或委托处理程序中执行此操作 - 以使逻辑更加集中,而不是在每个操作方法中都有逻辑。

    public class LogApiRequest : ActionFilterAttribute
        {
            public override void OnActionExecuting(HttpActionContext actionContext)
            {
                var text =  actionContext.Request.Content.ReadAsStringAsync().Result;
                MyLogger.Log(LogLevel.INFO, text);
    
                base.OnActionExecuting(actionContext);
            }
        }
    

    然后注册您的过滤器 - 通常在 WebApiConfig.cs 中或使用过滤器装饰您的操作方法或控制器类。

    config.Filters.Add(new LogApiRequest());
    

    【讨论】:

    • 嗨,govin,我尝试了第一个选项字符串文本作为参数,它始终为空。如果我将其更改为对象而不是字符串,我会看到内容,但不确定这是否正确。
    • 理想情况下,我稍后会按照您的建议创建过滤器,但是我只是尝试在 PostData 方法中读取它,并且 var 文本一直是“”。有什么想法吗?
    • 这很奇怪。您使用什么版本的 Web API?我还发布了另一种选择。看看这是否适合你..
    • 我正在使用 web api 2.0。奇怪,我无法在方法中读取它,但同一行代码在过滤器中起作用。不应该是同一个请求吗?感谢您的帮助队友
    • 好的,运行更多测试,我意识到如果我覆盖 OnAuthorization 方法它会起作用。如果我覆盖 OnActionExecuting,它总是空的“”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 2016-08-28
    • 2021-01-19
    相关资源
    最近更新 更多