从背景过程的基础Uri

时间:2010-03-01 23:24:06

标签: asp.net

在线程中运行时是否可以获取当前Web应用程序的基本uri?

请记住,HttpContext.Current将为null,因此没有可以使用的Request对象。

目标:能够从线程向Web应用程序中的不同URL发出Web请求以获取呈现的输出。

2 个答案:

答案 0 :(得分:1)

有几种方法可以做到这一点:

  1. 假设您可以使用localhost作为域名,请使用 "http://localhost" + HttpRuntime.AppDomainAppVirtualPath
  2. 如果您需要确切的域名并确定应用程序是否使用https以及所有那些花哨的东西,您需要访问HttpRequest本身。在这种情况下,在创建线程本身的方法中创建基本URL,并将其作为参数传递给线程。
  3.     string baseUrl = Request.Url.Scheme + "://" + Request.Url.Authority 
                          + Request.ApplicationPath.TrimEnd('/') + "/";
        ParameterizedThreadStart worker= new ParameterizedThreadStart(MyWorkerMethod);
        new Thread(worker).Start(baseUrl);
    

答案 1 :(得分:0)

您可以从IIS ADSI提供程序获取域和协议部分,但由于可能有许多绑定,您必须自己选择一个:

protected void ListServerBindings()
{
    var ls = new List<string>();
    var ss = HttpRuntime.AppDomainAppId.Split('/');
    var e = new DirectoryEntry("IIS://localhost/" + ss[2] + "/" + ss[3]);
    foreach(string s in e.Properties["ServerBindings"])
    {
        ss = s.Split(':');
        ls.Add("http://" + (ss[2].Length == 0 ? "localhost" : ss[2]) + (ss[1] == "80" ? null : ":" + ss[1]) + HttpRuntime.AppDomainAppVirtualPath);
    }
    foreach(string s in e.Properties["SecureBindings"])
    {
        ss = s.Split(':');
        ls.Add("https://" + (ss[2].Length == 0 ? "localhost" : ss[2]) + (ss[1] == "443" ? null : ":" + ss[1]) + HttpRuntime.AppDomainAppVirtualPath);
    }
    Response.Write(string.Join("<br />", ls.ToArray()));
}