Получение URL-адреса из пути к файлу в IHttpHandler (универсальный обработчик) - PullRequest
3 голосов
/ 01 мая 2011

В моем классе IHttpHandler (для страницы .ashx) я хочу найти в каталоге определенные файлы и вернуть относительные URL-адреса. Я могу получить файлы, нет проблем:

string dirPath = context.Server.MapPath("~/mydirectory");
string[] files = Directory.GetFiles(dirPath, "*foo*.txt");
IEnumerable<string> relativeUrls = files.Select(f => WHAT GOES HERE? );

Какой самый простой способ преобразовать пути к файлам в относительные URL? Если бы я был на странице aspx, я мог бы сказать this.ResolveUrl(). Я знаю, что мог бы выполнить некоторый анализ строки и заменить строку, чтобы получить относительный URL, но есть ли какой-нибудь встроенный метод, который позаботится обо всем этом для меня?

Редактировать: Чтобы уточнить, не делая мой собственный анализ строки, как мне перейти от этого:

* * 1010

к этому:

"/mydirectory/foo.txt"

Я ищу существующий метод, такой как:

public string GetRelativeUrl(string filePath) { }

Ответы [ 2 ]

1 голос
/ 14 марта 2013

Я могу представить, что у многих людей возникает этот вопрос ... Мое решение:

public static string ResolveRelative(string url)
{
    var requestUrl = context.Request.Url;
    string baseUrl = string.Format("{0}://{1}{2}{3}", 
        requestUrl.Scheme, requestUrl.Host, 
        (requestUrl.IsDefaultPort ? "" : ":" + requestUrl.Port), 
        context.Request.ApplicationPath);

    if (toresolve.StartsWith("~"))
    {
        return baseUrl + toresolve.Substring(1);
    }
    else
    {
        return new Uri(new Uri(baseUrl), toresolve).ToString();
    }
}

обновление

Или от имени файла к виртуальному путине проверял его; вам может понадобиться код, аналогичный приведенному выше ResoveRelative ... дайте мне знать, если он работает):

public static string GetUrl(string filename)
{
    if (filename.StartsWith(context.Request.PhysicalApplicationPath))
    {
        return context.Request.ApplicationPath +     
            filename.Substring(context.Request.PhysicalApplicationPath.Length);
    }
    else 
    {
        throw new ArgumentException("Incorrect physical path");
    }
}
0 голосов
/ 01 мая 2011

Попробуйте System.Web.Hosting.HostingEnvironment.MapPath метод, его статические и доступны в любом месте веб-приложения.

...