2

我想从 global asax 检索我网站的 url。此 url 必须是完整的(协议、域等)。有没有简单的方法可以做到这一点?

我试过VirtualPathUtility.ToAbsolute了,但它只给出了一个相对路径。

4

4 回答 4

11

尝试这个 :

HttpContext.Current.Request.Url.OriginalString

这样您就可以从全局 asax 访问 url。

Ps 你可以通过调试自己完成:

在此处输入图像描述

  • OriginalString被使用因为你想要完整的原产地信息。

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

于 2013-07-03T09:48:57.720 回答
5

您可以通过在 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
    }
}
于 2017-02-03T13:02:30.247 回答
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;
        }
    }
}
于 2017-02-19T16:15:10.520 回答
1

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

var url = HttpContext.Current.Request.Url;
bar myUrl = url.AbsoluteUri.Replace(url.PathAndQuery, VirtualPathUtility.ToAbsolute("~/WS/someFolder/someService.svc"));
于 2013-07-03T09:59:45.377 回答