从global asax获取页面的完整url

4
我想从global asax中检索到我的网站的URL。这个URL必须是完整的(包括协议,域名等)。有没有简单的方法来实现这一点?我尝试了VirtualPathUtility.ToAbsolute,但它只提供了一个相对路径。
4个回答

13

试一下这个:

HttpContext.Current.Request.Url.OriginalString

通过这种方式,您可以从global asax访问URL。

P.s. 您可以通过调试自己完成:

enter image description here

  • OriginalString被使用是因为你想要完整的源信息。

  • 您也可以使用没有端口的那个,即AbsoluteURI


2
它会显示一个错误,提示“请求在此上下文中不可用”。 - Rohit Arora
@RohitArora 如我所说:请使用 HttpContext.Current.Request 而不是 Request.... - Royi Namir
1
@RohitArora,你遇到这个错误是因为在Application_Start方法中Request不可用。 - Edyn

5
您可以通过在Global.asax中使用Application_BeginRequest方法和HttpApplication.Context.Request.Url来实现此目的。请注意,该方法将为每个请求触发一次。
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
    }
}

这会返回所有资源的所有请求,而不是浏览器中的URL。 - Pierre

2
在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;
        }
    }
}

1

多亏了 Royi,我现在记得如何做了(很久没做了):

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接