Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Can';t将autofac与web api 2和mvc集成_C#_Asp.net Mvc_Asp.net Web Api2_Autofac - Fatal编程技术网

C# Can';t将autofac与web api 2和mvc集成

C# Can';t将autofac与web api 2和mvc集成,c#,asp.net-mvc,asp.net-web-api2,autofac,C#,Asp.net Mvc,Asp.net Web Api2,Autofac,这件事花了我一个星期的时间 我用了很多方法来找到解决方案 mvc与autofac完全集成,但web api没有-( 这是我的密码: AutofacDi public static class AutofacDi { public static ValueTuple<IContainer, HttpConfiguration> Initialize() { var assembly = Assembly.GetExecutingAssembly();

这件事花了我一个星期的时间 我用了很多方法来找到解决方案

mvc与autofac完全集成,但web api没有-(

这是我的密码: 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);
    }
}
全球

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

 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
这对我来说是一个致命的问题,因为两周后我的网站应用程序无法使用。 我不知道该怎么办。
帮帮我!!!

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

builder.RegisterWebApiFilterProvider(config);


在AutofacDi中,您似乎已经解决了您的问题,我希望这是真的。这里有很多内容需要消化,但我确实在一开始就看到了一个关于OWIN集成和Web API的常见错误:

 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集成中的一个常见错误是在OWIN中使用
GlobalConfiguration.Configuration
,您可以从头开始创建配置。使用OWIN集成时,不应在任何地方引用
GlobalConfiguration.Configuration


在安装过程中,您可能会遇到额外的/其他挑战;如果遇到,请尝试放弃使用
GlobalConfiguration.Configuration

,但使用GlobalConfiguration.Configuration可以正常工作。您的意思是我应该将其更改为新的HttpConfiguration();为了什么?这就是OWIN的工作原理。这不是Autofac的事情,这是OWIN的事情。如果它现在工作,很好;如果你遇到更多的麻烦,这是我要看的第一件事。
builder.RegisterHttpRequestMessage(config);