2015-06-04 13 views
6

Ich bin mit StructureMap.MVC5StructureMap wirft Argument auf Httpcontext

ein sehr seltsamen Problem mit habe ich ein brandneues MVC5-Projekt in Visual Studio (Standardoptionen für ein ASP.net MVC-Projekt ausgewählt wurden links.)

Ich habe dann structuremap.mvc5 über den Paketmanager nuget (Install-Package StructureMap.MVC) installiert.

Ich habe dann den folgenden Code an die Spitze der "HomeController.cs" file:

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

ich dann einen Konstruktor und privaten Member wie folgt hinzugefügt: Schließlich

public class HomeController : Controller 
{ 
    private readonly ITest _test; 

    public HomeController(ITest test) 
    { 
     _test = test; 
    } 

, Ich aktualisierte das Ergebnis der About-Aktion wie folgt:

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

    return View(); 
} 

Das Projekt wird kompiliert und gestartet. Ich erhalte die Standard-Index-Seite als normal gegeben, aber dann irgendwo zwischen 2 und 5 Sekunden, nachdem die Seite in dem Browser zurückgegeben wird, erhalte ich eine Ausnahme geworfen in „StructureMapDependencyScope.cs“ auf der return Linie dieser Methode:

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

Die gegebenen genauen Fehler sind:

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: 

prüfen, System.Web.HttpContext.Current ist in der Tat an diesem Punkt null.

Wenn ich das Projekt stoppe und neu starte, tritt derselbe Fehler auf.
Wenn ich F5 drücke, um fortzufahren, funktioniert die Website weiterhin wie erwartet.
Wenn ich jedoch nach dem Drücken von F5 einige Augenblicke warte, stoppe und starte das Projekt neu, erhalte ich den Fehler nicht mehr, bis ich irgendeine Art von Codeänderung und Neuaufbau mache!

Das macht scheinbar keinen Sinn für mich!

Wie auch immer .. jede Hilfe wäre willkommen!

(mit VS2015 Enterprise-RC, wenn das einen Unterschied macht)

Antwort

5

Das Problem ist in der dispose des Behälters. Versucht, einen verschachtelten Container, der im HttpContext lebt, zu löschen, der im Moment der Verfügung null ist.

Ich habe diese Änderungen an der StructureMapDependencyScope Klasse, um diese Ausnahme zu vermeiden:

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); 
    } 
}