StructureMap在HttpContext上抛出ArgumentNullException

本文关键字:ArgumentNullException HttpContext StructureMap | 更新日期: 2023-09-27 17:53:10

我对StructureMap.MVC5有一个非常奇怪的问题

我在Visual Studio中创建了一个全新的MVC5项目(ASP.net MVC项目的默认选项保留选中)

然后我安装了structuremap。通过nuget包管理器(Install-Package StructureMap.MVC)。

然后在"HomeController.cs"文件的顶部添加以下代码:

namespace TestMVC.Controllers
{
    public interface ITest
    {
        string TestMessage();
    }
    public class Test : ITest
    {
        public string TestMessage()
        {
            return "this worked again 23";
        }
    }

然后添加了构造函数和私有成员,如下所示:

public class HomeController : Controller
{
    private readonly ITest _test;
    public HomeController(ITest test)
    {
        _test = test;
    }

最后,我更新了About操作结果如下:

public ActionResult About()
{
    ViewBag.Message = _test.TestMessage();
    return View();
}

项目编译并启动。我得到默认的索引页面作为正常,但然后在浏览器中返回页面后的2到5秒之间,我得到一个异常抛出在"StructureMapDependencyScope.cs"在此方法的return行:

private HttpContextBase HttpContext {
    get {
        var ctx = Container.TryGetInstance<HttpContextBase>();
        return ctx ?? new HttpContextWrapper(System.Web.HttpContext.Current);
    }
}

给出的准确误差是:

System.ArgumentNullException was unhandled by user code
  HResult=-2147467261
  Message=Value cannot be null.
Parameter name: httpContext
  ParamName=httpContext
  Source=System.Web
  StackTrace:
       at System.Web.HttpContextWrapper..ctor(HttpContext httpContext)
       at TestMVC.DependencyResolution.StructureMapDependencyScope.get_HttpContext() in d:'Code'Annies'AnniesV4'AnniesV4-BookingAdministration'TestMVC'DependencyResolution'StructureMapDependencyScope.cs:line 69
       at TestMVC.DependencyResolution.StructureMapDependencyScope.get_CurrentNestedContainer() in d:'Code'Annies'AnniesV4'AnniesV4-BookingAdministration'TestMVC'DependencyResolution'StructureMapDependencyScope.cs:line 55
       at TestMVC.DependencyResolution.StructureMapDependencyScope.DisposeNestedContainer() in d:'Code'Annies'AnniesV4'AnniesV4-BookingAdministration'TestMVC'DependencyResolution'StructureMapDependencyScope.cs:line 90
       at TestMVC.DependencyResolution.StructureMapDependencyScope.Dispose() in d:'Code'Annies'AnniesV4'AnniesV4-BookingAdministration'TestMVC'DependencyResolution'StructureMapDependencyScope.cs:line 85
       at TestMVC.App_Start.StructuremapMvc.End() in d:'Code'Annies'AnniesV4'AnniesV4-BookingAdministration'TestMVC'App_Start'StructuremapMvc.cs:line 44
  InnerException: 

检查,System.Web.HttpContext.Current在这一点确实是空的。

如果我停止并重新启动项目,会发生相同的错误。
如果我按F5继续,网站将继续正常运行。
但是,如果按下F5后,我等待一会儿,停止并重新启动项目,直到我进行某种代码更改和重建,我才再次得到错误!

这对我来说似乎毫无意义!

不管怎样. .任何帮助将不胜感激!

(使用VS2015 Enterprise RC如果有任何区别)

StructureMap在HttpContext上抛出ArgumentNullException

问题出在容器的处置上。正在尝试处理一个嵌套的容器,它存在于HttpContext中,在处理的时候是空的。

为了避免这个异常,我对StructureMapDependencyScope类做了以下更改:

public IContainer CurrentNestedContainer
{
    get
    {
        if (HttpContext == null)
            return null;
        return (IContainer)HttpContext.Items[NestedContainerKey];
    }
    set
    {
        HttpContext.Items[NestedContainerKey] = value;
    }
}
private HttpContextBase HttpContext
{
    get
    {
        var ctx = Container.TryGetInstance<HttpContextBase>();
        if (ctx == null && System.Web.HttpContext.Current == null)
            return null;
        return ctx ?? new HttpContextWrapper(System.Web.HttpContext.Current);
    }
}
相关文章:
  • 没有找到相关文章