【问题标题】:Can't integrate autofac with both web api 2 and mvc无法将 autofac 与 web api 2 和 mvc 集成
【发布时间】:2018-05-29 15:58:02
【问题描述】:

这件事需要我一周的时间 我已经做了很多方法来找到解决方案

mvc 与 autofac 完全集成,但 web api NO 和 NO! :-(

这是我的代码: AutofacDi

 public static class AutofacDi
{
    public static ValueTuple<IContainer, HttpConfiguration> Initialize()
    {
        var assembly = Assembly.GetExecutingAssembly();
        var builder = new ContainerBuilder();
        var config = GlobalConfiguration.Configuration;

        builder.RegisterControllers(assembly);
        builder.RegisterApiControllers(assembly).PropertiesAutowired();
        builder.RegisterHttpRequestMessage(config);
        builder.RegisterAssemblyModules(assembly);
        builder.RegisterAssemblyTypes(assembly).PropertiesAutowired();
        builder.RegisterFilterProvider();
        builder.RegisterWebApiFilterProvider(config);

        builder.RegisterModelBinders(assembly);
        builder.RegisterWebApiModelBinderProvider();
        builder.RegisterModelBinderProvider();
        builder.RegisterModule<AutofacWebTypesModule>();
        builder.RegisterSource(new ViewRegistrationSource());

        builder.RegisterType<T4MVC.Dummy>().AsSelf();
        builder.RegisterType<FoodDbContext>()
            .As<IUnitOfWork>()
            .InstancePerLifetimeScope();

        builder.Register(context => (FoodDbContext)context.Resolve<IUnitOfWork>())
            .As<FoodDbContext>()
            .InstancePerLifetimeScope();

        builder.RegisterType<ApplicationDbContext>().As<DbContext>().InstancePerLifetimeScope();
        builder.RegisterType<UserStore<ApplicationUser>>().As<IUserStore<ApplicationUser>>();
        builder.RegisterType<ApplicationUserManager>();
        builder.RegisterType<ApplicationSignInManager>();
        builder.Register(c => new IdentityFactoryOptions<ApplicationUserManager>()
        {
            DataProtectionProvider = new DpapiDataProtectionProvider("FoodBaMa")
        });

        builder.Register(c => HttpContext.Current.GetOwinContext().Authentication).InstancePerLifetimeScope();
        builder.RegisterType<RoleStore<IdentityRole>>().As<IRoleStore<IdentityRole, string>>();

        builder.RegisterAssemblyTypes(typeof(MvcApplication).Assembly)
            .Where(t => t.Name.EndsWith("Service"))
            .AsImplementedInterfaces()
            .InstancePerLifetimeScope();

        var container = builder.Build();

        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
        config.DependencyResolver = new AutofacWebApiDependencyResolver(container);

        return new ValueTuple<IContainer, HttpConfiguration>(container, config);
    }
}

OWIN 启动

    [assembly: OwinStartup(typeof(FoodBaMa.Startup))]
namespace FoodBaMa
{
    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            var iOc = AutofacDi.Initialize();
            app.UseAutofacMiddleware(iOc.Item1);
            app.UseAutofacMvc();
            app.UseWebApi(iOc.Item2);
            app.UseAutofacWebApi(iOc.Item2);
            WebApiConfig.Register(iOc.Item2);
            app.UseCors(CorsOptions.AllowAll);
            ConfigureAuth(app);
        }
    }
}

全球

 public class MvcApplication : HttpApplication
    {
        protected void Application_Start()
        {

                RouteConfig.RegisterRoutes(RouteTable.Routes);
                FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
                BundleConfig.RegisterBundles(BundleTable.Bundles);

                ViewEngines.Engines.Clear();
                ViewEngines.Engines.Add(new RazorViewEngine());

                ModelBinders.Binders.Add(typeof(string), new PersianModelBinder());

                MvcHandler.DisableMvcResponseHeader = true;

                DbInterception.Add(new ElmahEfInterceptor());
                DbInterception.Add(new YeKeInterceptor());

                GlobalConfiguration.Configuration.EnsureInitialized();


        }
}

ApiController

[AutofacControllerConfiguration]
    [WebApiCompress]
    [RoutePrefix("api/v1")]
    public class AppController : ApiController
    {
        private readonly IApiV1Service _apiService;

        public AppController(
            IApiV1Service apiService
            )
        {
            _apiService = apiService;
        }

         [HttpPost]
        [Route("app/mainview")]
        public virtual async Task<IHttpActionResult> MainView([FromBody] Request model)
        {
            var Result = new Models.API.V1.App.MainView.Response { Status = CheckTokenEnum.Error };
            try
            {
                if (ModelState.IsValid)
                    Result = await _apiService.MainView(model).ConfigureAwait(false);
            }
            catch (Exception ex)
            {
                ErrorLog.GetDefault(null).Log(new Error(ex));
            }

            return Json(Result, R8.Json.Setting);
        }
}

WebApiConfig

 public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {

            config.JsonIntegration();
            config.EnableCors(new EnableCorsAttribute("*", "*", "*"));
            config.MessageHandlers.Add(new CachingHandler(new InMemoryCacheStore()));
            config.MessageHandlers.Add(new PreflightRequestsHandler());
            config.Filters.Add(new ElmahHandleErrorApiAttribute());

            config.MapHttpAttributeRoutes();
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );



        }
    }

路由配置

 public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            //routes.IgnoreRoute("{*browserlink}", new { browserlink = @".*/arterySignalR/ping" });

            routes.MapMvcAttributeRoutes();
            AreaRegistration.RegisterAllAreas();

            //routes.LowercaseUrls = true;

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new
                {
                    controller = "Home",
                    action = "Index",
                    id = UrlParameter.Optional
                },
                 namespaces: new[] { "FoodBaMa.Controllers" }

            );

        }
    }

在每个 web api 请求上,返回:

HTTP Error 404.0 - Not Found
The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.

Module: IIS Web Core
Notification: MapRequestHandler
Handler: StaticFile
Error Code: 0x80070002

这对我来说是一个致命的问题,因为两周后我的网站应用程序就无法使用了。 我不知道该怎么办。 帮帮我!!!

【问题讨论】:

    标签: c# asp.net-mvc asp.net-web-api2 autofac


    【解决方案1】:

    我通过评论解决了这个问题:

    builder.RegisterWebApiFilterProvider(config);
    

    和

    builder.RegisterHttpRequestMessage(config);
    

    在AutofacDi

    中

    【讨论】:

      【解决方案2】:

      看来您可能已经解决了您的问题,我希望这是真的。这里有很多要消化的东西,但我确实在一开始就看到了一个关于 OWIN 集成和 Web API as documented in the Autofac docs 的常见错误:

      OWIN 集成中的一个常见错误是使用了GlobalConfiguration.Configuration。 在 OWIN 中,您从头开始创建配置。在使用 OWIN 集成时,您不应在任何地方引用 GlobalConfiguration.Configuration。

      您可能会在设置中遇到其他/其他挑战;如果您这样做,请尝试摆脱使用GlobalConfiguration.Configuration。

      【讨论】:

      • 但是使用 GlobalConfiguration.Configuration 可以正常工作。你的意思是我应该把它改成 new HttpConfiguration();为了什么?
      • 这就是它与 OWIN 一起工作的方式。那不是 Autofac 的事情,那是 OWIN 的事情。如果它现在可以工作,那就太好了;如果你遇到更多麻烦,那是我首先要看的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-15
      • 2015-04-08
      • 1970-01-01
      • 2013-02-27
      • 2012-11-14
      相关资源
      最近更新 更多