老程序员跪求 Autofac与ASP.NET Areas工程问题

carylin 2016-11-02 11:22:31
最近有个ASP.NET项目,工程类型为ASP.NET + MVC + WebApi2.2 + OWIN,希望引入Autofac这个Ioc框架。网上查了两三天,无解。现求助于各位高手。

相关代码见后。问题描述:

问题1:
当”备注2“代码使能语句

var config = new HttpConfiguration();

时,Areas中的AbcController构造参数可通过Atutofac注入,但HomeAreaRegistration中的路由设置失效。即,对于AbcController,只能通过链接
http://localhost:1607/api/abc/gettest访问,而不是http://localhost:1607/api/home/abc/gettest。

当把备注1代码切换成
var config = GlobalConfiguration.Configuration;
时,AbcController构造参数也可通过Atutofac注入,但HomeAreaRegistration中的路由设置有效,即只能通过http://localhost:1607/api/home/abc/gettest访问。但是,不能通过http://localhost:1607/Account/Login链接访问继承至Controller的AccountController(备注0)的Login方法——而先前的方式是正常的。

概括起来,HttpConfiguration不管是通过new HttpConfiguration新建一个,还是使用GlobalConfiguration.Configuration这个全局,都有各自问题。

问题2:
只要启用了Autofac,在ApiController中,HttpContext.Current.Session恒为null(注意,我已在Global文件中覆写了Init方法)。

以上,何解?
都说Autofac名气大,但不管国内还是国外的相关示例代码,没有一个是Areas工程的,到底支不支持Areas,真是郁闷。


==========================================================
相关代码:

web.config代码片段:

<system.web>
<authentication mode="Forms">
//****备注0
<forms loginUrl="~/Account/Login" timeout="2880" slidingExpiration="true" name=".STSASPAUTH" />
<!--<forms loginUrl="~/Home/Account2/Login" timeout="2880" slidingExpiration="true" name=".STSASPAUTH" />-->
</authentication>
<authorization>
<deny users="?" />
</authorization>
<compilation debug="true" targetFramework="4.5.2" />
<httpRuntime targetFramework="4.5.2" />
</system.web>


Global.asax.cs:

public class MvcApplication : System.Web.HttpApplication
{

protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
// eliminate this line code to let OWIN manage WebApi.
//GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}

public override void Init() //******备注1
{
PostAuthenticateRequest += MvcApplication_PostAuthenticateRequest;
base.Init();
}

private void MvcApplication_PostAuthenticateRequest(object sender, EventArgs e)
{
HttpContext.Current.SetSessionStateBehavior(
SessionStateBehavior.Required);
}
// .....
}


Startup.cs:

public partial class Startup
{
public void Configuration(IAppBuilder app)
{
AutofacConfig.Config(app);
ConfigureAuth(app);
}
}


AutofacConfig.cs:

class AutofacConfig
{
public static IContainer Container
{
get; private set;
}

public static void Config(IAppBuilder app)
{
var builder = new ContainerBuilder();

//...

builder.RegisterType<ApplicationDbContext>().AsSelf().As<DbContext>().InstancePerRequest();
//builder.RegisterType<ApplicationUserManager>().InstancePerRequest();
builder.Register<ApplicationUserManager>(
c => ApplicationUserManager.Create2(c.Resolve<IUserStore<UserEntity>>())).InstancePerRequest();
builder.RegisterType<UserStore<UserEntity>>().As<IUserStore<UserEntity>>();


// Get your HttpConfiguration. In OWIN, you'll create one
// rather than using GlobalConfiguration.
var config = new HttpConfiguration(); ///******************备注2*******************
//var config = GlobalConfiguration.Configuration;

// don't forget this line
//AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(config);

// for MVC ...
#region

// Register your MVC controllers.
builder.RegisterControllers(typeof(MvcApplication).Assembly);

// Run other optional steps, like registering model binders,
// web abstractions, etc., then set the dependency resolver
// to be Autofac.
// OPTIONAL: Register model binders that require DI.
builder.RegisterModelBinders(Assembly.GetExecutingAssembly());
builder.RegisterModelBinderProvider();

// OPTIONAL: Register web abstractions like HttpContextBase.
builder.RegisterModule<AutofacWebTypesModule>();

// OPTIONAL: Enable property injection in view pages.
builder.RegisterSource(new ViewRegistrationSource());

// OPTIONAL: Enable property injection into action filters.
builder.RegisterFilterProvider();

// OPTIONAL: Enable action method parameter injection (RARE).
//builder.InjectActionInvoker();
#endregion

// for WebApi2 ...
#region
// Register your Web API controllers.
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());

// OPTIONAL: Register the Autofac filter provider.
builder.RegisterWebApiFilterProvider(config);

#endregion

var container = builder.Build();
Container = container;
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);

// OWIN MVC and WebApi2 SETUP ...

// Register the Autofac middleware FIRST, then the Autofac Web API middleware,
// and finally the standard Web API middleware.
app.UseAutofacMiddleware(container);
app.UseAutofacMvc();
app.UseAutofacWebApi(config);
app.UseWebApi(config);
}
}


Areas/HomeAreaRegistration.cs:

public class HomeAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "Home";
}
}

public override void RegisterArea(AreaRegistrationContext context)
{
context.Routes.MapHttpRoute(
name: "Home_WebApiRout",
routeTemplate: "api/Home/{controller}/{action}/{id}",
defaults: new { action = "Index", id = RouteParameter.Optional }
);

context.MapRoute(
"Home_default",
"Home/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
}
}


Areas/Home/AbcController.cs
  public class AbcController : ApiController
{
private ApplicationSignInManager _signInManager;
private ApplicationUserManager _userManager;
private ICultureService _cultureSvc;
private IUserService _userSvc;
private ILogService _logSvc;

public AbcController(ICultureService cultureSvc, IUserService userSvc, ILogService logSvc)
{
_cultureSvc = cultureSvc;
_userSvc = userSvc;
_logSvc = logSvc;
}


[AllowAnonymous]
[HttpGet]
public IHttpActionResult GetTest()
{
var s = HttpContext.Current.Session;
return Ok();
}

}



AccountController.cs:

public class AccountController : Controller
{

// ...

public AccountController(ApplicationUserManager userManager, ApplicationSignInManager signInManager,
ICultureService cultureSvc, IUserService userSvc, ILogService logSvc)
{
UserManager = userManager;
SignInManager = signInManager;

_cultureSvc = cultureSvc;
_userSvc = userSvc;
_logSvc = logSvc;
}



//
// GET: /Account/Login
[AllowAnonymous]
public async Task<ActionResult> Login(string returnUrl)
{
ViewBag.ReturnUrl = returnUrl;

await _cultureSvc.DeduceCultureNameAsync();

return View();
}

//...
}
...全文
380 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
carylin 2016-11-05
  • 打赏
  • 举报
回复
还是没有完美解决。怎么不见各路大神赐教?
carylin 2016-11-03
  • 打赏
  • 举报
回复
这个问题是路由冲突和匹配问题。我现在遇到的,个人推测还是autofac整合问题,毕竟没有引入autofac时是正常的。
EnForGrass 2016-11-03
  • 打赏
  • 举报
回复
感觉和这个问题类似 http://stackoverflow.com/questions/29125412/web-api-2-area-routes
carylin 2016-11-03
  • 打赏
  • 举报
回复
context.Routes.MapHttpRoute方法没有namespaces参数,只有constraints。
另外,我用的是MVC5+Web API2.2,areas里可以支持webapi
yzf86211861 2016-11-03
  • 打赏
  • 举报
回复
好像很厉害的样子 看看 大牛怎么上天
EnForGrass 2016-11-03
  • 打赏
  • 举报
回复
好像ASP.NET MVC 4 Areas不支持WebAPI 其实我觉得你没必要建area,你在mvc里面随便建一个子文件夹放api,注册api就行了 参考http://stackoverflow.com/questions/11074117/asp-net-webapi-area-support
winner2050 2016-11-03
  • 打赏
  • 举报
回复
幸亏我用企业库,一步就过了。
EnForGrass 2016-11-03
  • 打赏
  • 举报
回复
HomeAreaRegistration 注册加上namespaces试试, context.MapRoute( name: "Home_WebApiRout", routeTemplate: "api/Home/{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = RouteParameter.Optional }, namespaces: new[] { "XXX.YYY.Controllers" } ); 另外默认的route不应该写到这里
  • 打赏
  • 举报
回复
Autofac.Mvc
修改一下昵称 2016-11-03
  • 打赏
  • 举报
回复
areas里面注册的路由时加上namespaces试试 public override void RegisterArea(AreaRegistrationContext context) { context.Routes.MapHttpRoute( name: "Home_WebApiRout", routeTemplate: "api/Home/{controller}/{action}/{id}", defaults: new { action = "Index", id = RouteParameter.Optional }, namespaces:new string[]{"xxx.xxx.xxx"} ); context.MapRoute( "Home_default", "Home/{controller}/{action}/{id}", new { action = "Index", id = UrlParameter.Optional }, namespaces:new string[]{"xxx.xxx.xxx"} ); }

62,047

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧