2

最近我问这个:

获取我的 Web 应用程序的基本 URL

这在一定程度上适用于调试,因为我使用的是 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 吗?

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

4

1 回答 1

4

简短的回答:你无法得到它,因为网站没有单一的规范基础 URI - 可以将网站(或者更确切地说,Web 应用程序)配置为响应任何绑定、任何域名和任何资源的请求路径 - 并且网站可以在主机网络服务器 (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();
}
于 2013-04-11T07:36:46.743 回答