加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在异常期间捕获原始HTTP POST数据

发布时间:2020-12-15 07:43:49 所属栏目:百科 来源:网络整理
导读:我有一个托管在IIS / ASP.NET中的WCF服务,它接受序列化对象的HTTP Post(不是表单发布). 如果客户端发送格式错误的请求(例如,他们没有正确序列化对象),我想记录发送的消息. 我们已经使用ELMAH来捕获未处理的异常,因此只需附加发布数据就是最简单的选择. 我可
我有一个托管在IIS / ASP.NET中的WCF服务,它接受序列化对象的HTTP Post(不是表单发布).

如果客户端发送格式错误的请求(例如,他们没有正确序列化对象),我想记录发送的消息.

我们已经使用ELMAH来捕获未处理的异常,因此只需附加发布数据就是最简单的选择.

我可以在异常期间获取当前的HttpContext,但是这只包含HTTP标头信息.

我的问题是:有没有办法捕获原始的HTTP POST请求体?或者,失败 – 更好的方法(没有反向代理)捕获导致错误的输入?

编辑:只是为了澄清,始终运行数据包级捕获并不合适.我正在寻找一个可以部署到生产服务器的解决方案,它将拥有我们无法控制或监控能力的客户端.

编辑#2:建议访问Request.InputStream – 如果您在WCF已从流中读取请求后尝试读取,则此操作无效.

我在这里看到了一个示例代码,以了解我是如何尝试使用它的.

StringBuilder log = new StringBuilder();

        var request = HttpContext.Current.Request;

        if (request.InputStream != null)
        {
            log.AppendLine(string.Format("request.InputStream.Position = "{0}"",request.InputStream.Position));
            if (request.InputStream.Position != 0)
            {
                request.InputStream.Seek(0,System.IO.SeekOrigin.Begin);
            }

            using (StreamReader sr = new StreamReader(request.InputStream))
            {
                log.AppendLine(string.Format("Original Input: "{0}"",sr.ReadToEnd()));
            }
        }
        else
        {
            log.AppendLine("request.Inputstream = null");
        }


        log.ToString();

log.ToString()的输出是:

    request.InputStream.Position = "0"
    Original Input: ""

解决方法

当它到达您的服务时,请求将被处理并且不可用.

但是……你可以附上一个message inspector. Message Inspectors允许你在它到达你的操作实现之前摆弄它.您可以创建消息的缓冲副本,并将其复制到OperationContext.Current中.

当然是丑陋的黑客,它将意味着内存开销,因为现在每个请求都会浮动两个消息副本.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读