我想弄清楚如何执行以下操作:
1)提交表单后,序列化原始发布数据并将其存储到数据库
2)从数据库中读取帖子数据并通过将其重新发布到相同的URL重播它
为了解释我的最终目标,我们有三个主要的环节:开发,接受和生产。我希望能够在开发中进行更改,然后通过执行相同的帖子将此更改提升为接受。
有人有什么想法吗?
谢谢, 保罗
答案 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中提取的二进制数据。在我的脑海中,我不确定.net中是否有类可以帮助解决这个问题。但是其中一个Web客户端可能有一个方法允许您指定请求的整个主体。
答案 3 :(得分:0)
我几乎无法通过这种方式实现完全自动化的应用程序。
您可以尝试使用支持记录和重播的开箱即用产品,例如:
Jmeter,Selenium,IOpus或某种程度的提琴手。 IOpus是最容易入手的。
您很快就会发现这是一种难以做到的事情,也许可以省去实施自己的记录/重播解决方案的麻烦。