【发布时间】:2011-06-20 17:04:28
【问题描述】:
我需要实现一个操作,在该操作中用户请求一个需要一段时间才能生成的文件(2 - 4 分钟)。之后,用户需要下载文件,优先通过 ASP.NET(使用浏览器下载工具)。只有指定的用户才能下载此文件。
这是我尝试的方法:
首先,我构建了一个双工 wcf 服务。用户用它需要的数据调用它,然后它开始生成文件,通过回调通道通知进度。最后,该服务应该向用户发送一个 url,即他将用来下载文件的令牌。这部分工作正常。
我将文件保存到 asp_data 文件夹中的临时文件夹中,以防止直接访问它。然后我创建了一个 aspx 页面来接收令牌(无论它是什么),根据当前用户、定义的过期时间验证它,并用文件替换响应。
然后事情变得一团糟。我不知道通过 WCF 生成令牌的正确方法,将其返回给客户端并使用它访问下载页面。我尝试了两种不同的方法,但我想我都放弃了:
为文件生成一个 guid,在 FormsAuthenticationTicket 中对其进行加密(使用用户信息和到期时间)并将其发送到客户端。然后,客户端使用票证加密字符串作为下载页面的令牌,它会根据当前票证验证票证中的用户,检查到期时间,提取 guid 并将文件发回。问题是生成的加密字符串变得非常大,无法在 url 中使用。
为文件生成一个 guid,将其保存在 httpcontext 会话中的票证(带有验证数据和文件路径)中。然后 wcf 服务将 guid 传递给客户端,客户端使用它来访问下载页面。下载页面检查会话、检索票证、提供文件。问题是我在访问 WCF 操作中的会话时遇到了一些麻烦。用户请求文件,服务器启动一个线程来生成文件并进行回调调用,因此第一个服务器调用返回(无)。当我成功生成文件后,回调线程会尝试访问会话、保存票证并在“FinishOperationXXX”回调中将 guid 返回给用户。但是,我无法访问会话,因为它似乎不再可用于回调线程。
我不想使用数据库来执行此操作,并且我试图避免通过 WCF 本身下载文件,但我需要让它工作。我想我会设法做到这一点,但我想知道:
我这样做很难吗? 有没有人知道如何实现类似的东西?
【问题讨论】: