无法将 autofac 与 web api 2 和 mvc 集成

Can't integrate autofac with both web api 2 and mvc

这件事需要我一个星期 我做了很多方法找到解决方案

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" }

            );

        }
    }

在每个网络 api 请求上,returns:

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

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

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

builder.RegisterWebApiFilterProvider(config);

builder.RegisterHttpRequestMessage(config);

AutofacDi

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

A common error in OWIN integration is use of the GlobalConfiguration.Configuration. In OWIN you create the configuration from scratch. You should not reference GlobalConfiguration.Configuration anywhere when using the OWIN integration.

您可以 运行 在您的设置中进行 additional/other 挑战;如果这样做,请尝试摆脱对 GlobalConfiguration.Configuration.

的使用