ASP .Net MVC保存并重放发布数据

时间:2009-06-30 17:42:45

标签: asp.net-mvc post

我想弄清楚如何执行以下操作:

1)提交表单后,序列化原始发布数据并将其存储到数据库

2)从数据库中读取帖子数据并通过将其重新发布到相同的URL重播它

为了解释我的最终目标,我们有三个主要的环节:开发,接受和生产。我希望能够在开发中进行更改,然后通过执行相同的帖子将此更改提升为接受。

有人有什么想法吗?

谢谢, 保罗

4 个答案:

答案 0 :(得分:4)

我做过类似的一次用于记录目的。我记录了GET和POST请求,以便可以复制它们,以便跟踪我们的测试组记录的错误以及实时应用程序。

这里最大的诀窍是你的网络应用程序大部分都是无状态的。如果您使用Sessoin传递应用程序周围的信息或在应用程序中使用ViewState,您可能会遇到更多障碍。

如果您已经将自己的网站创建为RESTful,那么这应该不会太难。而且,通过RESTful(http://en.wikipedia.org/wiki/Restful),我指的是这样一个事实,即任何给定的RESTful请求都不会对先前对服务器发出的请求做出任何假设 - 它们本身就是原子的,并包含执行任何操作所需的所有必要信息。试图表演。

我通过以下方式完成了这项工作:

1)我在我想要监控的动作上创建了ActionFilters。这些ActionFilters执行POST数据的捕获并将其保存到数据库中。这很有效,因为它在代码中的侵入性较小,并且很容易被添加/删除到我感兴趣的任何动作中。

2)ActionFilter基本上记录了请求类型(GET与POST,通过HttpContext.Current.Request.HttpMethod,如果我没记错)和请求mas所针对的URL。如果是POST,我将表单数据(HttpContext.Current.Request.Form)序列化为JSON。我之所以选择JSON是因为它是人类可读的(对于帮助诊断问题非常重要,这对我来说就是这个目的),而且由于你正在处理FORM数据,所以它足够扁平,可以轻松地序列化为一个漂亮的扁平JSON结构。我相信我也记录了所有其他请求变量(HttpContext.Current.Request.Headers)以供参考,尽管取决于您的需求可能是多余的。

我使用System.Web.Script.Serialization.JavaScriptSerializer来序列化表单数据。

所有这些数据都存储在数据库中(请求类型,URL,序列化后期数据,时间戳,当前用户等)

3)我创建了一个专门用于查看和重新调用请求的新MVC控制器。在我的例子中,它是LoggingController,因为我记录了监视请求。我的主要观点是所有请求和目标URL的列表。如果我向下钻取并查看特定条目的“查看”/“显示”,它会显示我记录的所有详细信息。

通过反序列化JSON数据并构建(在我的情况下隐藏)使用反序列化数据填充在“视图”页面上的表单字段,创建了操作的实际重复。然后我添加了一个按钮 - 绿色用于GET,红色用于POST。单击该按钮将复制该操作 - GET很简单,您只需将用户发送到目标页面即可。

但是,对于POST,我使用了一个警告用户的JavaScript“你将要复制POST请求,这可能会根据被调用的操作(删除,更新等)修改服务器上的数据。继续吗?”

如果他们点击是,则提交带有JavaScript的表单,使其成为POST操作,以及wala,重复操作。

在您的情况下,您将从您的某个环境中记录数据,然后将所述数据复制到您的其他环境数据库,这样您就可以加载相应的“LoggingController”并触发您想要的任何操作重复。

显然,你可以随意拿走这个。您可以使用“记录”数据来驱动某些单元测试等。

答案 1 :(得分:1)

这是将数据从一个环境移动到另一个环境的迂回方式。您应该使用XML,JSON或SQL查询形式的fixture来将数据从一个环境移动到另一个环境。使用一些简单的脚本可以进一步自动化该过程。

如果发生这种情况,你应该考虑正确的数据库复制。

无论如何,使用表单是一种非常愚蠢的做事方式,只需在后端完成所有操作,让数据库直接相互通信。

答案 2 :(得分:0)

首先要获得请求,您可以通过创建一个新的http模块来执行此操作,然后可以通过配置文件打开或关闭该模块。

在请求生命周期中找到您要保存邮件的位置(Maybee在BeginRequest中),并且您将要记录以下内容:

  • Request.InputStream
  • 地址
  • 用户信息(如果您要处理身份验证)

另一方面,当您准备发布数据时,您需要找到一种方法,让您只需重新发布从Request.InputStream中提取的二进制数据。在我的脑海中,我不确定.net中是否有类可以帮助解决这个问题。但是其中一个Web客户端可能有一个方法允许您指定请求的整个主体。

答案 3 :(得分:0)

我几乎无法通过这种方式实现完全自动化的应用程序。

您可以尝试使用支持记录和重播的开箱即用产品,例如:

Jmeter,Selenium,IOpus或某种程度的提琴手。 IOpus是最容易入手的。

您很快就会发现这是一种难以做到的事情,也许可以省去实施自己的记录/重播解决方案的麻烦。