我有一个WCF服务中接受HTTP发布IIS / ASP.NET托管(不会形成交)序列化对象的。

如果客户端发送格式不正确的请求(例如他们不正确序列化的对象),我想发送日志了该消息。

我们已经在使用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: ""
有帮助吗?

解决方案

通过它得到服务的时间处理请求,而不是提供给您。

不过...你可以附上的消息检查的。消息督察允许您与消息拨弄它达到你的操作实施之前。可以创建该消息的缓冲副本,并且将其复制到OperationContext.Current。

当然丑陋的黑客攻击,这将意味着存储器开销现在该消息的两个副本浮动大约为每一个请求。

其他提示

你看看System.Web.Request.InputStream房产吗?它应该有你想要什么。

如何 “倒带” InputStream的性质。

    if (Request.InputStream.Position != 0)
    {
        Request.InputStream.Seek(0, System.IO.SeekOrigin.Begin);
    }

你应该考虑另一种选择是捕捉在BeginRequest事件与一个HttpModule此信息。这些数据应在BeginRequest事件在那里,因为我不相信WCF拿起请求,直到PostAuthenticateEvent后。

这ASP.NET(IIS下ASP web服务)可以在以下代码有助于:

if (request.InputStream.Position != 0)
{
  request.InputStream.Seek(0, System.IO.SeekOrigin.Begin);
}

WCF也许不同(即它看完后处置的InputStream)

使用Fiddler。从MS免费。巨大的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top