Получить URL-адрес файла из объекта, который не наследует System.Web.Ui.Page

У меня есть объект, для которого требуется URL-адрес файла, находящегося в корневом каталоге моего веб-приложения. Если бы это был объект, унаследованный от System.Web.Ui.Page, я бы просто использовал объект httpRequest. Однако, поскольку этот объект не работает, я не уверен, как получить этот URL-адрес. В зависимости от вызывающего объекта URL-адрес будет либо /something.htm, либо ~/something.htm.

Может ли кто-нибудь показать мне дорогу? Спасибо!

-Ник


person Nick    schedule 09.07.2009    source источник


Ответы (2)


Джон все правильно понял. Вы можете/должны использовать объект HttpContext.Current.Request, как он заявил. Я думаю, вы также ищете URL-адрес только до корня. Другими словами, вам не нужны параметры имени страницы или строки запроса, если они существуют.

Эта процедура немного неприятна, но она должна дать вам то, что вам нужно. Обратите внимание на ссылку на HttpContext.Current.Request.

private string UrlUpToRootWithNoPageReferenceOrQueryStringParameters()
{
    string Port = HttpContext.Current.Request.ServerVariables["SERVER_PORT"];

    if (Port == null || Port == "80" || Port == "443")
        Port = "";
    else
        Port = ":" + Port;

    string Protocol = HttpContext.Current.Request.ServerVariables["SERVER_PORT_SECURE"];

    if (Protocol == null || Protocol == "0")
        Protocol = "http://";
    else
        Protocol = "https://";

    return Protocol + Context.Request.ServerVariables["SERVER_NAME"] + Port + Context.Request.ApplicationPath;
}

Есть более короткие способы получить то, что вы хотите, но опять же описанная выше процедура будет работать. Если вас интересуют дополнительные сведения, ознакомьтесь с Rick Strahl's Making Sense of ASP.NET. Пути для получения дополнительной информации.

person Ben Griswold    schedule 09.07.2009

Я не уверен, почему вы использовали бы для этого HttpRequest, но вы можете использовать HttpContext.Current.Request, предполагая, что HttpContext.Current не равен нулю.

person John Saunders    schedule 09.07.2009
comment
Ну.. тут я не уверен. Так что это не код объекта. Поэтому я не уверен, как я могу создать экземпляр HTTPRequest из своего класса. - person Nick; 10.07.2009
comment
Это не инстанцирование. Создание экземпляра — это создание экземпляра класса. То, что я показал вам, ничего не создает. - person John Saunders; 10.07.2009
comment
Я в курсе. Но если бы я хотел использовать объект HTTPRequest..., мне нужно было бы иметь его экземпляр. Глядя на этот класс, я не уверен, какие аргументы он требует. Имеет ли это смысл? - person Nick; 10.07.2009
comment
Пожалуйста, используйте следующее: HttpContext.Current.Request. Используйте это просто так. Я бы не сказал вам об этом, если бы не ожидал, что это сработает. Мне было бы стыдно, а мне это не нравится. ;-) - person John Saunders; 10.07.2009
comment
Спасибо Джон .. Это меня близко. И я думаю, что это ответ. Я работал в этом направлении. Что у меня есть: HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Path); Теперь мне просто нужно выполнить некоторые манипуляции со строками, чтобы я мог отрезать путь после виртуального каталога.. т.е. www.something/virtualdir/filename.htm Очень близко! - person Nick; 10.07.2009
comment
@John - Ваш ответ заслуживает кучу голосов. Вы действительно работали для этого. :) - person Ben Griswold; 10.07.2009