嗨,我已经搜索了相当多的但是我没有找到真正与我相似的情况。希望我没有错过任何地方的重复
目标:将文件从UNC共享作为下载/打开选项返回给客户端。
信息:共享位于与托管网站的服务器不同的服务器上。当单击菜单上的相应文件夹名称时,我能够从共享中成功读取(我将文件作为JSON结果返回),然后在Jquery中,我为文件夹中找到的每个文件附加列表项并创建列表项ID是文件名。这很有效。
当点击这些附加的列表项时,我将它们的ID(它们是文件名,如“thefile.pdf”)传递给后面的控制器,该控制器返回一个FileContentResult。
下面的 files[0].ToString()
类似于“\ server \ folder \”
public ActionResult OpenTheFile(string id)
{
List<string> files = new List<string>();
files.AddRange(Directory.GetFiles(LNFiles.ThePath, id, SearchOption.AllDirectories));
Response.AppendHeader("Content-Disposition", "attachment; filename=" + id + ";");
return File(files[0].ToString(), System.Net.Mime.MediaTypeNames.Application.Pdf, id);
}
是的,必须“它在我的本地机器上工作”。当部署到IIS 7.5服务器并单击列表项时,我收到此YSOD错误:
句柄无效。 (例外 HRESULT:0x80070006(E_HANDLE))
我模仿拥有文件共享权限的用户......我不知所措,我在考虑使用编码或搞砸权利?我尝试使用虚拟目录,但同样的问题。
答案 0 :(得分:3)
就我而言
改变这个:
public ActionResult Download(int id)
{
var item = ItemRepo.GetItemById(id);
string path = Path.Combine(Server.MapPath("~/App_Data/Items"), item.Path);
return File(path, "application/octetstream", item.Path);
}
到此:
public ActionResult Download(int id)
{
var item = ItemRepo.GetItemById(id);
string path = Path.Combine(Server.MapPath("~/App_Data/Items"), item.Path);
return File(new FileStream(path, FileMode.Open), "application/octetstream", item.Path);
}
已经奏效了。我把它放在这里以防万一有需要。
答案 1 :(得分:1)
请查看此解决方法 您可能需要尝试数据包捕获,以查看是否收到与此处记录的相同的问题: http://forums.asp.net/t/1473379.aspx/1
对于你的unc路径 - 您是直接引用\ servername \ share还是使用网络映射的驱动器盘符?
答案 2 :(得分:1)
上帝保佑你:ProgRockCode。
由于涉及ActionResult,我编写了一个使用“WriteFile”方法的自定义ActionResult。
public override void ExecuteResult(ControllerContext context)
{
context.HttpContext.Response.WriteFile(FilePath, true);
context.HttpContext.Response.End();
}