【问题标题】:C# IIS 7 Base UrlC# IIS 7 基本网址
【发布时间】:2013-04-11 07:06:03
【问题描述】:

最近我问这个:

Get Base URL of My Web Application

这在一定程度上在调试中起作用,因为我使用的是 VS 开发服务器。

然后我生成了一个安装程序,然后安装程序将指向 IIS 7。

我有:

    void Application_Start(object sender, EventArgs e)
    {
        _baseUrl = HttpContext.Current.Request.Url.ToString();
        ....
    }

但这引发了以下错误:

请求在此上下文中不可用

然后我做了一些阅读,这就是发生这种情况的原因:

http://mvolo.com/iis7-integrated-mode-request-is-not-available-in-this-context-exception-in-applicationstart

然后我使用上面的技术将代码从 Application_Start 移到 Application_BeginRequest,因为我发现 Application_BeginRequest 被执行了多次。

但问题是我需要 IIS 7 的基本 URL,以便在 Application_Start 中使用,所以我尝试在其中设置一个全局字符串:

FirstRequestInitialization.Initialize(context);

但在尝试这样做时并不令人惊讶:

Application["BaseUrl"] = HttpContext.Current.Request.Url.ToString();

我收到此错误: 'Microsoft.Web.Administration.Application' 是一个“类型”,但用作“变量”

我想要的只是 IIS 7 的基本 URL。

我无法使用目录条目,因为我不支持 IIS 6。

我该怎么做?任何解决方法?我可以从 VS 执行 AppCmd 吗?

非常感谢任何帮助。谢谢!

【问题讨论】:

    标签: c# iis-7 appcmd


    【解决方案1】:

    简短回答:您无法理解,因为网站没有单一的规范基础 URI - 可以将网站(或者更确切地说,网络应用程序)配置为响应任何绑定、任何域名的请求,和任何资源路径 - 并且网站可以在主机网络服务器 (IIS) 中重新配置,而应用程序根本不会意识到这一点。

    如果你真的想存储你的“基本 URL”(即使这样的东西实际上并不存在),那么你可以在 Application_BeginRequest 中这样做:

    private static readonly Object _arbitraryUrlLock = new Object();
    private static volatile String _arbitraryUrl;
    
    public void Application_BeginRequest() {
        if( _arbitraryUrl == null ) 
            lock( _arbitraryUrlLock )
                if( _arbitraryUrl == null ) 
                    _arbitraryUrl = HttpContext.Current.Request.Url.ToString();
    }
    

    【讨论】:

    • 我会添加注释,您要在执行锁定之前检查 _arbitraryUrl 是否为空,并且仅在它为空时才执行锁定,否则您将不必要地锁定每个请求。
    • 感谢 Dai,CarlosAg,我想在应用程序启动时为 IIS7 中的所有应用程序创建超链接,这就是我需要基本 URL 的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-07
    相关资源
    最近更新 更多