在我的应用程序中,我有时会想要获取用户请求,将其保存在某个地方,然后在下一个请求中模拟已保存的请求而不是实际请求,这可能吗?
答案 0 :(得分:0)
使用任何Web调试器。我自己使用Fiddler 2.6.2。
答案 1 :(得分:0)
请注意 - 没有可靠的方法(有很多边缘情况需要考虑)但希望这会让你开始:
取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)你删除了“重放”查询字符串。否则请求将一遍又一遍地播放。
第三,根据您存储请求表单的方式,您将不得不考虑如何将其与用户/浏览器/会话/窗口关联。处理每一个都有它自己的问题。
一旦您解决了以上问题,您将成功模拟已保存的请求!