7

私は非常に奇妙な問題を抱えていますStructureMap.MVC5

Visual Studio でまったく新しい MVC5 プロジェクトを作成しました (ASP.net MVC プロジェクトの既定のオプションは選択されたままです)。

次に、nuget パッケージ マネージャー ( Install-Package StructureMap.MVC) を介して structuremap.mvc5 をインストールしました。

次に、「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 秒後に、returnこのメソッドの行の "StructureMapDependencyScope.cs" で例外がスローされます。

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この時点では確かに null です。

プロジェクトを停止して再起動すると、同じエラーが発生します。
F5 キーを押して続行すると、Web サイトは期待どおりに機能し続けます。
ただし、F5 キーを押した後、しばらく待ってからプロジェクトを停止して再起動すると、何らかのコード変更を行って再構築するまでエラーは発生しません。

これは一見私には意味がありません!

とにかく..どんな助けもいただければ幸いです!

(それが違いを生む場合は、VS2015 Enterprise RC を使用します)

4

1 に答える 1

10

問題は容器の廃棄です。破棄の瞬間に null である 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);
    }
}
于 2016-10-28T15:21:19.363 に答える