1

好的,所以 .NET Framework 包含一个TransactionScope有助于为诸如数据库之类的事物登记事务的方法。但是,我似乎找不到与对象模型相似的东西。

我有一个 ASP.NET Web 窗体应用程序,当用户单击Export to Excel我创建的链接时,我将添加到Excel 文件Response上的对象中。HttpContext这当然需要一些修改,例如标题,甚至写入byte[]Excel 文件。

但是,如果失败了,我会得到部分发出的响应,并且它只是被破坏了。

有没有一种技术可以让我加入对象模型事务?

4

1 回答 1

2

虽然您当然可以尝试在此处创建一个在事务中注册自身的资源(请参阅ISinglePhaseNotification接口以及上的EnlistVolatile方法,但这不是您想要做的正确方法,因为它在技术上是不可能的。Transaction

根据是否在 ASP.NET 中启用缓冲,一旦将字节写入响应,这些字节就会发送到客户端,因为HTTP 协议没有任何机制来指示客户端应该丢弃以前发送的字节。(注意:Web 服务确实支持事务,但这不是 Web 服务,方法会有所不同)。

也就是说,您可以做的是在服务器端创建一个事务,并让另一个对象创建 Excel 文件句柄在事务中登记,但这也有点矫枉过正:您已经表明您要发送的响应Excel工作表,仅此而已。没有其他需要协调的东西,所以没有必要进行交易(除非还有其他你没有指出的事情)。

考虑到这一点,您可以轻松地将创建 Excel 文件的方法写入内存/MemoryStream实例中的字节数组或文件系统,然后根据您是否成功写入流或响应失败以其他方式。

当然,这里有一个性能折衷,因为您正在将工作表写入中间介质(内存将比文件系统快,但您必须考虑工作表的大小以及正在写入的工作表数量)然后是响应,但这是您必须做出的权衡(无论您是否在交易中这样做)。

这里的交易是矫枉过正和错误的设计选择。

于 2012-11-14T17:15:54.273 回答