我喜欢从全球的asax中检索我的网站的网址。此网址必须完整(协议,域名等)。有没有一种简单的方法可以做到这一点?
我尝试了VirtualPathUtility.ToAbsolute
,但它只提供了相对路径。
答案 0 :(得分:10)
试试这个:
HttpContext.Current.Request.Url.OriginalString
这样您就可以从全局的asax访问网址。
P.S。你可以通过调试自己完成:
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中做到这一点,但是每次发出的请求都会触发,而不仅仅是第一个请求。如果这是一个问题,您需要设置一个虽然为每个请求调用的初始化程序,但只触发一次。
相关位:
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;
}
}
}