Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获取完整的主机名+;Global.aspx的应用程序启动中的端口号?_C#_Asp.net_Url_Request_Hostname - Fatal编程技术网

C# 如何获取完整的主机名+;Global.aspx的应用程序启动中的端口号?

C# 如何获取完整的主机名+;Global.aspx的应用程序启动中的端口号?,c#,asp.net,url,request,hostname,C#,Asp.net,Url,Request,Hostname,我试过了 Uri uri = HttpContext.Current.Request.Url; String host = uri.Scheme + Uri.SchemeDelimiter + uri.Host + ":" + uri.Port; 它在我的本地机器上运行得很好,但是当发布到IIS7时,有一个例外是 System.Web.HttpException: Request is not available in this context 有人知道如何实现这一点吗?当web应用程序启动

我试过了

Uri uri = HttpContext.Current.Request.Url;
String host = uri.Scheme + Uri.SchemeDelimiter + uri.Host + ":" + uri.Port;
它在我的本地机器上运行得很好,但是当发布到IIS7时,有一个例外是

System.Web.HttpException: Request is not available in this context

有人知道如何实现这一点吗?

当web应用程序启动时,不会处理HTTP请求

您可能需要处理并定义请求上下文可用的应用程序_BeginRequest(objectsender,EventArgs e)方法

编辑:以下是一个代码示例,其灵感来自Michael Shimins链接到的Mike Volodarsky的博客:

    void Application_BeginRequest(Object source, EventArgs e)
    {
        HttpApplication app = (HttpApplication)source;
        var host = FirstRequestInitialisation.Initialise(app.Context);
    }

    static class FirstRequestInitialisation
    {
        private static string host = null;
        private static Object s_lock = new Object();

        // Initialise only on the first request
        public static string Initialise(HttpContext context)
        {
            if (string.IsNullOrEmpty(host))
            {
                lock (s_lock)
                {
                    if (string.IsNullOrEmpty(host))
                    {
                        var uri = context.Request.Url;
                        host = uri.GetLeftPart(UriPartial.Authority);
                    }
                }
            }

            return host;
        }
    }

可以接受的答案是好的,但在大多数情况下(如果第一个请求是HTTP请求),您最好使用
Session\u Start
事件,每个用户大约每20分钟调用一次(不确定会话的有效时间)<代码>应用程序_BeginRequest将在每次请求时启动

public void Session_Start(Object source, EventArgs e)
{
   //Request / Request.Url is available here :)
}

回答这个问题,如果有人决定搜索这个话题

这适用于任何模式下的应用程序启动

typeof(HttpContext).GetField("_request", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(HttpContext.Current)

这不应该是
Uri=context.Request.Url也不能将下一行简化为仅
uri.GetLeftPart(UriPartial.Authority)这也应该是一个静态类,您不需要初始化主机。因此,在第一个HTTP请求到达之前,确实没有办法获取端口号?实际上没有。ASP.NET网站可以有多个绑定,它可以在多个主机和多个端口号下运行(例如,网站的安全和非安全版本).  您只有一个web应用程序实例正在运行,传入的请求包含关于发起请求的主机的信息。web应用程序只知道它是一个应用程序,它没有运行在哪个主机下的真实上下文。如果您的应用程序有两个绑定,一个用于端口80,另一个用于端口8080,您想要哪一个?你不知道,这就是为什么你希望它是基于每个请求的。这是一个非常优雅的解决方案。我发现需要在应用程序启动时获取“基本”域,并在JIT应用程序时使用它。我最终将逻辑转移到Begin_请求中。应用程序\u Start现在为空,Begin\u请求包含逻辑和一个简单的域是否为空的检查。请注意,字段是非公共的(即私有的)。您应该非常小心地使用非文档化的功能和字段,因为它们可以在没有进一步信息的情况下进行更改。它与
HttpContext.Current.Request
???我看到同样的结果,听起来就像你在集成模式下运行,而不是经典模式(我认为你在本地运行)。问题是请求在IIS7中的应用程序_Start中不可用。请看:这很好地解释了这一点。另请参阅,以获得从URL获取scheme+主机+端口的更简洁的方法(一旦有了URL)。