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

0

this thing takes one week from me i have done many methods to find a solution

mvc fully integrated with autofac, but web api NO and NO! :-(

here is my codes: 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 Startup

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

Global

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



        }
    }

RouteConfig

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

            );

        }
    }

on each web api request, 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

It's a killing problem for me because it's two weeks that making my website application unusable. i don't know what to do. help me !!!

c#
asp.net-mvc
asp.net-web-api2
autofac
asked on Stack Overflow May 29, 2018 by Arash Sh

2 Answers

0

i fixed that issue by commenting:

builder.RegisterWebApiFilterProvider(config);

and

builder.RegisterHttpRequestMessage(config);

in AutofacDi

answered on Stack Overflow May 30, 2018 by Arash Sh
0

It appears you may have gotten past your issue, which I hope is true. There's a lot to digest in here, but I do see a common mistake in the very start with respect to OWIN integration and 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.

You may run into additional/other challenges in your setup as it sits; if you do, try getting rid of the use of GlobalConfiguration.Configuration.

answered on Stack Overflow May 30, 2018 by Travis Illig

User contributions licensed under CC BY-SA 3.0