虽然您当然可以尝试在此处创建一个在事务中注册自身的资源(请参阅ISinglePhaseNotification
接口以及类上的EnlistVolatile
方法,但这不是您想要做的正确方法,因为它在技术上是不可能的。Transaction
根据是否在 ASP.NET 中启用缓冲,一旦将字节写入响应,这些字节就会发送到客户端,因为HTTP 协议没有任何机制来指示客户端应该丢弃以前发送的字节。(注意:Web 服务确实支持事务,但这不是 Web 服务,方法会有所不同)。
也就是说,您可以做的是在服务器端创建一个事务,并让另一个对象创建 Excel 文件句柄在事务中登记,但这也有点矫枉过正:您已经表明您要发送的响应是Excel工作表,仅此而已。没有其他需要协调的东西,所以没有必要进行交易(除非还有其他你没有指出的事情)。
考虑到这一点,您可以轻松地将创建 Excel 文件的方法写入内存/MemoryStream
实例中的字节数组或文件系统,然后根据您是否成功写入流或响应失败以其他方式。
当然,这里有一个性能折衷,因为您正在将工作表写入中间介质(内存将比文件系统快,但您必须考虑工作表的大小以及正在写入的工作表数量)然后是响应,但这是您必须做出的权衡(无论您是否在交易中这样做)。
这里的交易是矫枉过正和错误的设计选择。