从asp.net Web应用程序在本地系统上打开文本文件

可以在发布评论后添加说明,事实上我意识到我原来的问题非常令人困惑。 这就是我想要实现的……

这将是在本地Intranet上运行而不是在Internet上运行的Web应用程序。 最终,我希望从Web应用程序中打开网络文件夹位置。 例如,Web应用程序在文件服务器上创建具有集合结构的文件夹,即:

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

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

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

原始问题

我创建了.Net / C#web应用程序,我想在指定位置打开一个文本文件。 以下代码在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 

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

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

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

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

编辑:

您的选项正在提供代码中显示的文件:

 Response.ContentType = "application/octet-stream"; Response.AddHeader("Content-Disposition", _ "attachment; filename=""" & 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. 内容处理:“内联”和“附件”有什么区别?
  2. http://www.nullskull.com/articles/20011006.asp
  3. http://www.windowsdevcenter.com/pub/a/dotnet/2002/04/01/asp.html

你的问题的意图仍然不明确。

你是…

A.尝试从客户端浏览器连接到Web应用程序(由IIS托管)并从网络共享(相对于服务器)访问文件以供客户端使用?

B.尝试从客户端浏览器连接到Web应用程序(由IIS托管),并让应用程序访问服务器使用的网络文件(如.txt文件,其中包含应用程序需要进行某些处理的信息) ?

C.尝试从客户端浏览器连接到Web应用程序(由IIS托管),并让托管应用程序从网络共享(相对于客户端)访问文件以供服务器使用?

我的假设是您正在尝试(B),如果是这样,您应该使用System.IO并以编程方式访问您的文件,而不是尝试启动进程。

更新如下

如果您尝试连接到Web应用程序,并在客户端上启动本地进程(例如notepad.exe),则无法通过启动进程来执行此操作。 否则MyVirus.com可以在我的机器上启动本地进程,这将是一场噩梦。 Web应用程序只会在服务器上启动进程,而不是客户端。

您可以做的最好的事情是打开文件(从服务器)并使用文件内容将响应发送回客户端,或者将路径和文件名发送到客户端并通过javascript或HTML5 FileReader打开它。

额外更新

您应该能够从UNC路径打开图像(或浏览器中的其他内容),只要您的应用程序池标识具有权限,并且您是否正在使用模拟(identity impersonate =“true”userName =“someaccount “password =”somepassword“)?

一个最后的更新

不幸的是,即使打开文件夹位置也需要启动本地进程(explorer.exe)。 出于安全原因,现在的浏览器根本就不会发生这种情况。 您可以在检查数据库的每台客户端计算机上烹饪像本地Windows服务一样的东西,如果找到x,它会将本地explorer.exe启动到存储在数据库中的路径……但它必须每秒检查一次这听起来真的很糟糕。

除此之外,像Telerik的这个文件浏览器控件或这个文件视图控件 可以满足您的需要。 (免责声明,我对这些控件中的任何一个都不了解,只是认为它们可能有所帮助)。

请看这个页面

http://msdn.microsoft.com/en-us/library/58wxa9w5(v=vs.100).aspx

最重要的是这一行

在使用现有项目时使用,或者您的站点以旧版IIS(例如IIS 6)为目标,并且测试环境与生产环境紧密匹配并不是非常重要。 此服务器选项是Visual Studio中的默认选项。 但是,Visual Studio开发服务器在与完整IIS不同的安全上下文中运行,并且可能无法揭示在部署到IIS的生产版本时可能发生的错误。

问题是IISExpress和本地开发服务器在您的安全上下文下运行。 这使他们可以更自由地启动进程并访问本地系统上的文件。

然而,IIS在更严格的安全上下文中运行,并且对手头的机器具有有限的访问权限。 想象一下,如果IIS可以做你上面提出的建议。 你基本上可以在网络服务器上运行任意代码。