【发布时间】:2016-01-22 09:58:59
【问题描述】:
在我的应用程序中,有时我想获取用户请求,将其保存在某个位置,然后在下一个请求中模拟保存的请求而不是真实请求,这可能吗?
【问题讨论】:
-
你想在你的应用程序中做这一切,还是只是调试一个问题?
-
啊。您使用的是 MVC 还是 WebForms?
标签: asp.net httprequest httpresponse
在我的应用程序中,有时我想获取用户请求,将其保存在某个位置,然后在下一个请求中模拟保存的请求而不是真实请求,这可能吗?
【问题讨论】:
标签: asp.net httprequest httpresponse
使用任何网络调试器。我自己使用 Fiddler 2.6.2。
【讨论】:
请注意 - 没有可靠的方法来做到这一点(有很多边缘情况需要考虑),但希望这可以帮助您入门:
获取Request.Form.ToString() 并将其保存在某处以对抗用户。对于测试,我建议将其放在隐藏字段中,但在某些时候您可能需要将其移至数据库并以某种方式将其与用户相关联。
您需要有一个字段来告诉您是否应该重播之前的请求。使用像?replay=true 这样的查询字符串参数将起作用。然后将其拉入您的页面:
protected bool IsReplayRequest
{
get
{
return bool.Parse(this.GetValue(p => p.Request["replay"], "false"));
}
}
要模拟请求,您需要覆盖页面的DeterminePostBackMode。这是 ASP.NET 调用以启动回发过程的第一个方法。使用转换为NameValueCollection 的已保存请求表单。像这样的:
protected override NameValueCollection DeterminePostBackMode()
{
if (IsReplayRequest && SavedFormData != null)
{
if (!string.IsNullOrWhiteSpace(SavedFormData.Data))
{
return HttpUtility.ParseQueryString(SavedFormData.Data ?? string.Empty);
}
}
return base.DeterminePostBackMode();
}
其中SavedFormData 只是一个保存请求表单和用户信息的类。
通过这 3 个步骤,您应该能够成功模拟先前对简单页面的请求
现在是潜在的问题:
首先,视图状态可能会妨碍您。如果您有任何列表框或数据网格或身份验证等,则需要将视图状态与表单数据一起保存。为此,您需要覆盖页面GetStatePersister() 方法(Is it possible to make a custom implementation of ViewState?)。
其次,一旦你模拟了一个请求,你需要确保 a) 没有数据被破坏 b) 你删除了“重播”查询字符串。否则请求会反复播放。
第三,根据您存储请求表单的方式,您将不得不考虑如何将其与用户/浏览器/会话/窗口相关联。处理每一个都有它自己的问题。
一旦您解决了上述所有问题,您将成功模拟保存的请求!
【讨论】: