C# 从全局asax获取页面的完整url

C# 从全局asax获取页面的完整url,c#,asp.net,global-asax,C#,Asp.net,Global Asax,我想从global asax检索我的网站的url。此url必须完整(协议、域等)。有没有一个简单的方法 我尝试了虚拟实用性。为了解决问题,它只给出了一个相对路径。试试这个: HttpContext.Current.Request.Url.OriginalString 通过这种方式,您可以从全局asax访问url 另外,您可以通过调试自己完成: 使用了OriginalString,因为您需要完整的原始信息 您也可以使用不带端口的,即AbsoluteURI 多亏了罗伊,我现在才想起该怎么做

我想从global asax检索我的网站的url。此url必须完整(协议、域等)。有没有一个简单的方法

我尝试了虚拟实用性。为了解决问题,它只给出了一个相对路径。

试试这个:

HttpContext.Current.Request.Url.OriginalString
通过这种方式,您可以从全局asax访问url

另外,您可以通过调试自己完成:

  • 使用了
    OriginalString
    ,因为您需要完整的原始信息

  • 您也可以使用不带端口的,即
    AbsoluteURI


    • 多亏了罗伊,我现在才想起该怎么做(很久没做了):


      您可以通过在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
          }
      }
      

      在Global.asax的Application_Start方法期间无法获取URL。正如@Edwin所指出的,您可以在应用程序_BeginRequest中执行此操作,但这会激发每个请求,而不仅仅是第一个请求。如果这是一个问题,您需要设置一个初始值设定项,该初始值设定项虽然为每个请求调用,但只触发一次

      这里有一篇关于这个问题的文章:

      以及相关比特:

      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;
              }
          }
      }
      
      void应用程序\u开始请求(对象源,事件参数e)
      {
      HttpApplication应用程序=(HttpApplication)源;
      HttpContext=app.context;
      //尝试创建第一个请求初始化
      初始化(上下文);
      }
      类FirstRequestInitialization
      {
      私有静态bool s_InitializedAlready=false;
      私有静态对象s_lock=新对象();
      //仅在第一个请求时初始化
      公共静态void初始化(HttpContext上下文)
          {
      如果(s_已初始化)
      返回;
      锁(s_锁)
              {
      如果(s_已初始化)
      返回;
                  /* > */
      s_InitializedAlready=真;
              }
          }
      }
      
      它给出了一个错误,说“请求在此上下文中不可用”。@rohitara正如我所说的:使用
      HttpContext.Current.Request
      not
      Request….
      @rohitara您收到错误是因为请求在应用程序的启动方法中不可用。这会将所有请求返回到所有资源,而不是浏览器中的URL
      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;
              }
          }
      }