c# - 从 asp.net web 应用程序打开本地系统上的文本文件

标签 c# asp.net iis

好的,在发表评论后添加澄清,事实上我意识到我原来的问题非常困惑。这就是我要实现的目标......

这将是一个在本地 Intranet 上而不是在 Internet 上运行的 Web 应用程序。最后,我想从 Web 应用程序中打开一个网络文件夹位置。因此,例如,Web 应用程序在文件服务器上创建具有一组结构的文件夹,即:

\server\jobnumber\exhibitreference\image1 \server\jobnumber\exhibitreference\image2

我希望用户能够导航到记录并单击链接以打开其匹配的文件夹位置。用户、网络服务器和文件服务器都在同一个域中。

下面的代码只是作为一个示例,在我开始尝试远程文件夹之前,尝试让它在我的本地机器上为文件/文件夹工作。我很欣赏这令人困惑。

原始问题

我已经创建了 .Net/C# 网络应用程序,我想在指定位置打开一个文本文件。下面的代码在 IIS Express 上运行时运行良好,但一旦发布到 IIS,它就无法运行。

目前 IIS Express 和 IIS 7 正在我的本地计算机上运行。 IIS 应用程序池配置为在我的域帐户下运行(必须这样做,因为我们有一个到 SQL 服务器的双跳身份验证问题)到目前为止,我有以下代码:

ProcessStartInfo processStartInfo = new ProcessStartInfo();
processStartInfo.WorkingDirectory = @"C:\Users\pcustance\Desktop\";
processStartInfo.FileName = @"notepad.exe";
processStartInfo.Arguments = "test.txt";
processStartInfo.WindowStyle = ProcessWindowStyle.Maximized;
processStartInfo.CreateNoWindow = true;

Process process = Process.Start(processStartInfo);

通过任务管理器查看系统进程,我可以看到进程“notepad.exe”已成功创建,但没有窗口打开。它说该进程正在“pcustance”帐户下运行,但我只能在任务管理器中选择“显示所有用户的进程”时才能看到它。

窗口未启动是因为它以某种方式在错误的帐户下运行吗?

我也试过:

Process.Start("C:\Users\pcustance\Desktop\test.txt");

和以前一样,这在 IIS Express 中有效,但在 IIS7 中无效。

非常感谢任何帮助。

解决方案

目前我不得不求助于 Internet Explorer,它支持开箱即用的本地链接。浏览器可以指向具有以下内容的网络位置:

file:///\\server\folder\location
or 
file://///server/folder/location

最佳答案

您的所有代码都在托管在服务器(通过 IIS)中的 asp.net 中运行。

您编写的代码将在托管您的 asp.net 应用程序的上下文中执行。

在使用 Visual Studio 进行 Web 开发时,“服务器”和“客户端”(即浏览器)通常是同一台计算机。代码在本地化 开发服务器的上下文中执行。您的浏览器将向“那个”服务器发出请求。因此,您编写的代码势必会给您一种错觉,即您已经启动了该过程 - notepad.exe

您实际实现的内容一般不适用于 Web 应用程序。这甚至是不可行的。由于“服务器”和“客户端”现在是两台不同的机器。最接近实现此要求的方法是提供文件作为响应。对于最终用户,这等同于下载(在大多数情况下)。

编辑:

您的选项按代码所示提供文件:

Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", _
  "attachment; filename=""" & filename & """");

这将强制用户使用 filename 中的值指定的默认名称将文件下载到客户端。实际上,您可以改变 Content-Disposition 部分来指示浏览器如何加载。但是,这取决于目标浏览器。这是一个小例子:

FileStream MyFileStream = new FileStream(@"d:\inetpub\wwwroot\small.txt", FileMode.Open);
long FileSize;
FileSize = MyFileStream.Length;
byte[] Buffer = new byte[(int)FileSize];
MyFileStream.Read(Buffer, 0, (int)MyFileStream.Length);
MyFileStream.Close();
Response.ContentType="text/plain";
Response.AddHeader( "content-disposition","inline; filename=sample.txt");
Response.BinaryWrite(Buffer);

您应该研究一些文章并进行实验。以下是一些链接:

  1. Content-Disposition:What are the differences between "inline" and "attachment"?
  2. http://www.nullskull.com/articles/20011006.asp
  3. http://www.windowsdevcenter.com/pub/a/dotnet/2002/04/01/asp.html

关于c# - 从 asp.net web 应用程序打开本地系统上的文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20354978/

相关文章:

asp.net - 线程如何通过 Http.sys、IIS 和 ASP.NET 与请求绑定(bind)

sharepoint - TWebBrowser和NTLM身份验证

c# - Observable.Range 被重复?

c# - 如何从 net Core 中的异常中获取行号和文件名?

javascript - 在 javascript 中调用 C# 函数,它在页面加载之前执行。为什么?

c# - .NET 在为 WCF 服务生成类型时加载寻找另一个版本的程序集

javascript - 具有自动播放功能的 HTML5 视频阻止源文件夹被重命名

c# - VS2010 C#函数使用循环

c# - Azure 函数当时仅具有最大并发数

c# - 如何解决 System.StackOverflowException : 'Exception of type ' System. StackOverflowException' 被抛出。生成随机代码时出现异常?