"No owin.Environment item was found in the context" exception in ASP.NET Mvc/Web Api application -
"No owin.Environment item was found in the context" exception in ASP.NET Mvc/Web Api application -
we've got mvc 5.1 app works autofac di. i've implemented basic web api functionality pull , post info works. want add together authentication on web api controllers. in order this, going utilise of same autofac configuration we've written mvc. so, create calls such as:
builder.registercontrollers(assembly).instanceperhttprequest(); builder.registerapicontrollers(assembly); builder.registermodelbinders(assembly).instanceperhttprequest(); builder.registertype<logattribute>().propertiesautowired(); builder.registerfilterprovider(); // needed allow property injection in custom action filters. builder.registertype<extensibleactioninvoker>().as<iactioninvoker>(); if (modules != null) { foreach (var module in modules) { builder.registermodule(module); } } we've got api module contains code below , registered (we know because we've debugged , seen code called):
public class mvcmodule : module { protected override void load(containerbuilder builder) { builder.registermodule(new autofacwebtypesmodule()); builder.register(ctx => httpcontext.current.getowincontext()).as<iowincontext>(); builder.register(ctx => httpcontext.current.user.identity).as<iidentity>().instanceperlifetimescope(); builder.register(ctx => httpcontext.current.getowincontext().getusermanager<applicationusermanager>()).as<applicationusermanager>().instanceperlifetimescope(); builder.register(c => bundletable.bundles).as<bundlecollection>().instanceperlifetimescope(); builder.register(c => routetable.routes).as<routecollection>().instanceperlifetimescope(); builder.registertype<currentuser>().as<icurrentuser>().instanceperlifetimescope(); builder.registertype<applicationuser>().as<iapplicationuser>().instanceperlifetimescope(); builder.registertype<usermanager<applicationuser, guid>>(); builder.register(c=>new appcontext()).instanceperhttprequest(); base.load(builder); } } public class apimodule: module { protected override void load(containerbuilder builder) { builder.registerassemblytypes(assembly.getexecutingassembly()) .where(t => !t.isabstract && typeof(apicontroller).isassignablefrom(t)) .instancepermatchinglifetimescope(autofacwebapidependencyresolver.apirequesttag); builder.registerassemblytypes(assembly.getexecutingassembly()).propertiesautowired(); builder.registermodule<autofacwebtypesmodule>(); } } we have these 2 statements should set resolvers both mvc , web api (i think):
globalconfiguration.configuration.dependencyresolver = new autofacwebapidependencyresolver(container); dependencyresolver.setresolver(new autofac.integration.mvc.autofacdependencyresolver(container)); we've got mvc accountcontroller looks similar next (some methods removed clarity):
public class accountcontroller : basecontroller { public accountcontroller(iowincontext owincontext, idatamanager itemsmanager) : base(owincontext, itemsmanager) { } // post: /account/login [httppost] [allowanonymous] [validateantiforgerytoken] public async task<actionresult> login(loginviewmodel model, string returnurl) { if (modelstate.isvalid) { var user = await usermanager.findasync(model.email, model.password); if (user != null) { homecoming await logincommon(user, model.rememberme, returnurl); } modelstate.addmodelerror("", "invalid username or password."); } // if got far, failed, redisplay form homecoming view(model); } } when app started, user can login. expected, iowincontext injected controller autofac. in other words, line in mvc module correctly registers owincontext:
builder.register(ctx => httpcontext.current.getowincontext()).as<iowincontext>(); the usermanager can find user if they've registered.
within our api business relationship controller, have next action:
[route("{email}")] public async task<httpresponsemessage> getuser(string email) { var user = await usermanager.findbyemailasync(email); if (user != null) { homecoming request.createresponse(httpstatuscode.ok, user); } homecoming request.createresponse(httpstatuscode.notfound); } however, usermanager doesn't work - exception raised:
system.invalidoperationexception occurred hresult=-2146233079 message=no owin.environment item found in context. source=microsoft.owin.host.systemweb stacktrace: @ system.web.httpcontextextensions.getowincontext(httpcontext context) @ application1.ui.infrastructure.modules.mvcmodule.<load>b__0(icomponentcontext ctx) in c:\tfs\application1\main\source\.net\application1.ui\infrastructure\modules\mvcmodule.cs:line 25 innerexception: the module that's beingness called autofac mvc module, not web api one. line exception occurs one:
builder.register(ctx => httpcontext.current.getowincontext()).as<iowincontext>(); in other words, httpcontext object doesn't appear configured correct. however, discussed earlier, setup because works in same application mvc.
so question is, if mvc , web api beingness used in same application, should owin config application set?
i have viewed questions asked topic, no avail.
is possible configure autofac work asp.net mvc , asp.net web api
and
mvc web api rtm not working autofac integration
in searching resolutions particular exception, i've found couple talk missing owin configuration:
no owin.environment item found in context
and
no owin.environment item found in context - on server
however, can't understand how configuration missing when owin works fine mvc part of application.
we're using vs 2013, .net 4.5.1, mvc 5.1 , autofac web.api integration.
we're doing similar in project, have got working using autofac. have usermanager injected userservice (just domain layer class @ nowadays time rather actual service), can access usermanager both api , mvc controller methods. here's how i've set things up, may help. haven't created separate modules api , mvc stuff, thrown in (your resolvers set correctly way).
first, web module:
public class webmodule : module { protected override void load(containerbuilder builder) { builder.registerfilterprovider(); builder.registertype<extensibleactioninvoker>().as<iactioninvoker>(); builder.registercontrollers(assembly.getexecutingassembly()) .injectactioninvoker(); builder.registerapicontrollers(assembly.getexecutingassembly()); // owin builder.register(c => httpcontext.current.getowincontext()) .as<iowincontext>().instanceperlifetimescope(); // module chaining builder.registermodule<datamodule>(); } } next, info module (there's other modules aren't relevant):
public class datamodule : module { protected override void load(containerbuilder builder) { var context = new entitycontext(); builder.registerinstance(context).as<ientitycontext>().singleinstance(); builder.register(x => new userstore<applicationuser>(context)) .as<iuserstore<applicationuser>>().instanceperlifetimescope(); builder.register(x => { var userstore = x.resolve<iuserstore<applicationuser>>(); var usermanager = new usermanager<applicationuser>(userstore); homecoming usermanager; }); } } my entitycontext identitydbcontext<applicationuser> i've wrapped in interface can set false user store , stuff that.
the thing can see that's different you're doing don't seem passing identitycontext usermanager when it's registered.
asp.net-mvc asp.net-web-api visual-studio-2013 owin
Comments
Post a Comment