从全局asax获取完整的URL到页面

时间:2013-07-03 09:47:08

标签: c# asp.net global-asax

我喜欢从全球的asax中检索我的网站的网址。此网址必须完整(协议,域名等)。有没有一种简单的方法可以做到这一点?

我尝试了VirtualPathUtility.ToAbsolute,但它只提供了相对路径。

4 个答案:

答案 0 :(得分:10)

试试这个:

HttpContext.Current.Request.Url.OriginalString

这样您就可以从全局的asax访问网址。

P.S。你可以通过调试自己完成:

enter image description here

  • OriginalString被用于想要完整的原始信息。

  • 您也可以使用没有AbsoluteURI

  • 端口的那个

答案 1 :(得分:2)

您可以通过在Global.asax和HttpApplication.Context.Request.Url中使用Application_BeginRequest方法来实现此目的。请记住,该方法将针对每个请求触发。

public class Global : System.Web.HttpApplication
{
    private void Application_Start(object sender, EventArgs e)
    {
        // Code that runs on application startup
    }

    void Application_BeginRequest(Object source, EventArgs e)
    {
        var app = (HttpApplication)source;
        var uriObject = app.Context.Request.Url;
        //app.Context.Request.Url.OriginalString
    }

    void Application_Error(object sender, EventArgs e)
    {
        // Code that runs on application error
    }

    private void RegisterRoutes(RouteCollection routes)
    {
        // Code that runs on register routes
    }
}

答案 2 :(得分:1)

感谢Royi,我现在想起如何做到这一点(很长一段时间我没有这样做):

var url = HttpContext.Current.Request.Url;
bar myUrl = url.AbsoluteUri.Replace(url.PathAndQuery, VirtualPathUtility.ToAbsolute("~/WS/someFolder/someService.svc"));

答案 3 :(得分:1)

在Global.asax的Application_Start方法期间无法获取URL。正如@Edwin所指出的那样,你可以在Application_BeginRequest中做到这一点,但是每次发出的请求都会触发,而不仅仅是第一个请求。如果这是一个问题,您需要设置一个虽然为每个请求调用的初始化程序,但只触发一次。

以下是关于该问题的文章:http://mvolo.com/iis7-integrated-mode-request-is-not-available-in-this-context-exception-in-applicationstart/

相关位:

void Application_BeginRequest(Object source, EventArgs e)
{
    HttpApplication app = (HttpApplication)source;
    HttpContext context = app.Context;

    // Attempt to peform first request initialization
    FirstRequestInitialization.Initialize(context);
}


class FirstRequestInitialization
{
    private static bool s_InitializedAlready = false;
    private static Object s_lock = new Object();

    // Initialize only on the first request
    public static void Initialize(HttpContext context)
    {
        if (s_InitializedAlready)
            return;

        lock (s_lock)
        {
            if (s_InitializedAlready)
                return;

            /* << Perform first-request initialization here >> */
            s_InitializedAlready = true;
        }
    }
}