Squ*_*azz 5 .net c# iis internet-explorer ms-office
我正在Intranet上工作,并且使用IE可以打开本地Office安装的文档存在一些问题。
我使用以下锚标记为用户提供文件:
<a target="_blank" download="{{fileName}}" href="{{filePath}}">
Run Code Online (Sandbox Code Playgroud)
当用户单击此链接时,IE会为用户提供打开或保存它的决定。如果用户选择打开文件,然后决定他/她想要编辑文件,则他们在Office应用程序顶部单击“启用编辑”。这给用户一个错误,因为Office应用程序无法连接到站点并获取用户要编辑的文件。
Office应用程序名称无法连接到(我的文件)...
我要做的是让用户编辑他们在网上找到的文档的副本。然后他们可以保存副本,然后重新上传。
我认为问题之一是文件受登录保护。也许Intranet正在SSL上运行。
在研究问题的解决方案时,我从Microsoft找到了此支持页面,该页面讨论了我正在经历的事情。他们在错误消息三中写道:
Office应用程序名称无法打开文件。
就我而言,我得到的信息是:
Office应用程序名称无法连接到(我的文件)...
几乎相同,Microsoft写道,一个问题可能是:
当Internet Explorer通过SSL与安全网站通信时,Internet Explorer会强制执行任何无缓存请求。如果存在一个或多个标题,则Internet Explorer不会缓存该文件。因此,Office无法打开该文件。
这让我开始思考,然后我开始研究此问题,找到StackOverflow页面,例如“如何为每个文件夹配置静态内容缓存...”和“利用IIS中的浏览器缓存”。我还检查了《 IIS.net配置参考》,以查看此处是否有任何可以帮助我解决问题的内容。
我认为主要的问题是,打开文件时,该文件未保存在本地,因此Office应用程序无法对其进行编辑。到目前为止,我认为解决此问题的方法是删除无缓存头,而对文件使用某种短缓存,以便浏览器强制下载该文件。
我尝试了链接的前两篇SO文章中的技术,尝试在web.config中设置静态文件的缓存,但是强制缓存没有任何改变(当我询问时,我使用此技术来确保缓存控件正确无误文件)。Office应用程序仍尝试从其无权访问的网页打开文件。
我尝试的另一件事是强制Internet Explorer下载该文件。完全删除该选项以将其打开。Microsoft也有关于它的支持页面。但这似乎没有用。在Global.asax中,我尝试了以下代码(只是看是否可以使Word文件正常工作):
<script runat="server">
void Application_PreSendRequestHeaders(Object sender, EventArgs e) {
Response.Headers.Set("Content-Type", "application/ms-word");
Response.Headers.Set("Content-Disposition", "attachment; filename=fname.ext");
}
</script>
Run Code Online (Sandbox Code Playgroud)
但这只会使Internet Explorer尝试下载我尝试访问的所有页面。
我们总是检查用户是否确实有权访问所请求的文件。我们不希望人们窥探其他文件。禁用此检查将导致所有Office应用程序都可以在用户要编辑文件时打开文件。但这是一个糟糕的解决方案,并且带来了很多安全问题。
所以我的问题是,“如何启用在IE中从受登录保护的Intranet打开的Office文档中进行编辑?” 如果与缓存有关,那么我该如何解决?当用户选择“打开”文件时,是否可以通过某种方式告诉IE保存本地副本,以及如何告诉Office应用程序查找文件的本地缓存版本,而不是尝试从中下载文件?服务器?
我将问题缩小为Office应用程序的身份验证。当我单击Office应用程序中的“启用编辑”按钮时,该应用程序正在尝试下载文件,以便它可以编辑文件。然后,该请求被服务器拒绝(服务404),因为Office应用程序未登录,并且没有任何类型的cookie来告知服务器实际上确实可以访问该文件。这导致用户收到一条消息,通知用户无法打开请求的文件。
您应该能够设置各个调用的标头,以便可以下载文件。如果您使用 MVC,则调用return Controller.File(),有一个fileDownloadName选项负责设置attachment; filename=...标头,以便强制下载。
这是操作(使用 MVC):
public FileResult Download() {
...
return File(filename, mimetype, fileDownloadName)
}
Run Code Online (Sandbox Code Playgroud)
如果您不使用 MVC,则仅在提供文件时使用此调用:
Response.Headers.Set("Content-Disposition", "attachment; filename=" + fileDownloadName);
Run Code Online (Sandbox Code Playgroud)
顺便说一句,这是对问题的非常彻底的解释!
| 归档时间: |
|
| 查看次数: |
1363 次 |
| 最近记录: |