使用.ashx页面中文件的相对路径

时间:2013-02-22 14:56:44

标签: c# asp.net

双重道歉 - 首先,我对ASP.net完全陌生,所以我确信这是一个非常天真的问题,其次,看起来关于ASP.NET中的相对路径已经有一百个问题了。不幸的是 - 我找不到能回答我问题的那个。

背景 - 我正在处理一个需要能够访问Excel文件的.ashx文件。

当我在本地运行并使用文件的绝对路径时,一切都很好。这是我的代码:

<%@ WebHandler Language="C#" Class="MyHandler" %>
using System;
... [a bunch more "usings..."]
using Microsoft.Office.Interop.Excel;

public class MyHandler : IHttpHandler {
    public void ProcessRequest(HttpContext context) {
        string path = @"C:\Users\[...]\myExcelFile.xls";
        Workbook theWorkbook;
        Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
        theWorkbook = app.Workbooks.Open(path);

但是,我想在服务器上运行它,并使用myExcelFile.xls的相对路径。

我的项目设置如下:

Main folder:
 - Default.aspx
 - myExcelFile.xls
 - Web.config
 - Global.asax
Styles folder
Scripts folder
Handler folder
 - MyHandler.ashx (that's reading the Excel File)
bin folder

所以 - 您可以看到Excel文件位于应用程序的“根”中。

为了使路径相对,我尝试了以下但没有成功:

假设“relative”来自myHandler.ashx:

string path = @"..\myExcelFile.xls":

假设~指的是“根”:

string path = @"~\myExcelFile.xls";

猜猜:

string path = @".\myExcelFile.xls";

只是绝望:

string path = "myExcelFile.xls";

这些都不起作用。

所以我在这里做了一些研究,发现System.IO.Path.GetFullPath。所以我试过了:

string path = System.IO.Path.GetFullPath("myExcelFile.xls");

这不起作用,但至少我可以看到path的价值是C:\Program Files (x86)\Common Files\Microsoft Shared\DevServer\11.0\PinpointTool-DC.xls

当然 - 我根本不明白 - 那条路离我的项目不远(这意味着我不明白System.IO.Path.GetFullPath做了什么......)

最后,我尝试了Server.MapPath("myExcelFile.xls"),但这根本不起作用(至少在本地):

Compiler Error Message: CS0103: The name 'Server' does not exist in the current context

那么,我怎样才能使它工作(理想情况下是在本地和服务器上?)

2 个答案:

答案 0 :(得分:4)

虽然您可以使用context.Server.MapPath,但您也可以使用在appSettings部分的“web.config”文件中定义的路径,稍后在应用程序中阅读该路径:

的Web.config:

...
<appSettings>
    <add key="myBasePath" value="C:\Some\Path" />
</appSettings>
...

在您的ASHX处理程序中,您可以编写如下内容:

...
string path = Path.Combine(
    ConfigurationManager.AppSettings[@"myBasePath"],
    @"myExcelFile.xls");
...

您可以(并且应该)为您的开发机器和生产环境提供不同的“web.config”文件。

关于服务器上 Office Interop 的第二个John Saunders' remark,我强烈建议您使用像

这样的decidated库

我和他们两个都成功(虽然是商业)。

答案 1 :(得分:3)

你试过吗

System.IO.Path.Combine(HttpContext.Current.Server.MapPath("~/."),"myExcelFile.xls");

希望这会有所帮助