我想从 global asax 检索我网站的 url。此 url 必须是完整的(协议、域等)。有没有简单的方法可以做到这一点?
我试过VirtualPathUtility.ToAbsolute
了,但它只给出了一个相对路径。
我想从 global asax 检索我网站的 url。此 url 必须是完整的(协议、域等)。有没有简单的方法可以做到这一点?
我试过VirtualPathUtility.ToAbsolute
了,但它只给出了一个相对路径。
尝试这个 :
HttpContext.Current.Request.Url.OriginalString
这样您就可以从全局 asax 访问 url。
Ps 你可以通过调试自己完成:
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 所指出的,您可以在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;
}
}
}
感谢 Royi,我现在记得如何做到这一点(很长时间我没有这样做):
var url = HttpContext.Current.Request.Url;
bar myUrl = url.AbsoluteUri.Replace(url.PathAndQuery, VirtualPathUtility.ToAbsolute("~/WS/someFolder/someService.svc"));