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

时间:2018-05-29 15:58:02

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

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

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



        }
    }

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

            );

        }
    }

在每个网络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

这对我来说是一个杀戮问题,因为它使我的网站应用程序无法使用两周。 我不知道该怎么做。 帮帮我!!!

2 个答案:

答案 0 :(得分:0)

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

builder.RegisterWebApiFilterProvider(config);

builder.RegisterHttpRequestMessage(config);
AutofacDi

中的

答案 1 :(得分:0)

看来你可能已经超越了你的问题,我希望这是真的。这里有很多要消化的内容,但我确实在一开始就看到了一个常见的错误,即OWIN集成和Web API as documented in the Autofac docs

  

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

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