【问题标题】:HttpContext.GetService in MonoMono 中的 HttpContext.GetService
【发布时间】:2012-02-11 21:00:52
【问题描述】:

我有以下代码(从 here 提取),我正尝试在带有 mono 2.10.5 的 linux 服务器上运行它。

private static HttpContext GetCurrentContext(ControllerContext context) {
    var currentApplication = (HttpApplication)context.HttpContext.GetService(typeof(HttpApplication));
    if (currentApplication == null) {
        throw new NullReferenceException("currentApplication");
    }

    return currentApplication.Context;
}

在单声道上运行时,我得到以下异常,这很简单:

System.NotImplementedException: The requested feature is not
implemented.   at System.Web.HttpContextWrapper.GetService
(System.Type serviceType) [0x00000] in <filename unknown>:0

我可以使用一种已知的解决方法在单声道上实现相同的结果吗?

【问题讨论】:

    标签: asp.net asp.net-mvc mono


    【解决方案1】:

    不确定 Mono 中的 GetService 方法,但您提升的代码可以像这样缩短:

    private static HttpContextBase GetCurrentContext(ControllerContext context) {
        return context.HttpContext;
    }
    

    当您可以直接访问 HttpContext 时,您实际上并不需要通过 Application 来获取它。我还将返回类型更改为HttpContextBase 而不是HttpContext,因为在 ASP.NET MVC 中建议始终使用抽象。它使您的代码更加弱耦合和单元测试。

    或者,如果出于某些我不知道的原因,您想使用实际的 HttpContext(不知道为什么有人想将他的代码绑定到它),您可以尝试以下操作:

    private static HttpContext GetCurrentContext(ControllerContext context) {
        return context.HttpContext.ApplicationInstance.Context;
    }
    

    但正如您在这两种情况下看到的那样,GetCurrentContext 静态方法的存在变得非常值得怀疑。

    【讨论】:

    • 提升、刻痕等... - 听起来都比被盗要好;)你让我走到了一半 - GetService 被用来将 HttpContextBase 转换为 HttpContext(根据 ELMAH 的要求)。从这篇文章 (stackoverflow.com/a/4567707/794) 上的 cmets 看来,context.HttpContext.ApplicationInstance.Context 可以解决问题(并且在单声道上工作)。如果你想编辑你的答案,我会接受。
    猜你喜欢
    • 1970-01-01
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 2012-08-06
    相关资源
    最近更新 更多