Невозможно интегрировать autofac с web api 2 и mvc - PullRequest
0 голосов
/ 29 мая 2018

эта штука отнимает у меня одну неделю. Я нашел много способов найти решение

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

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 голосов
/ 30 мая 2018

Похоже, что вы, возможно, преодолели свою проблему, что, я надеюсь, правда.Здесь есть много чего переварить, но в самом начале я вижу распространенную ошибку, связанную с интеграцией OWIN и веб-API , как описано в документах Autofac :

AРаспространенной ошибкой в ​​интеграции OWIN является использование GlobalConfiguration.Configuration. В OWIN вы создаете конфигурацию с нуля. Вы не должны ссылаться на GlobalConfiguration.Configuration нигде при использовании интеграции OWIN.

Вы можете столкнуться с дополнительными / другими проблемами в вашей настройке какего это;если вы это сделаете, попробуйте избавиться от использования GlobalConfiguration.Configuration.

0 голосов
/ 30 мая 2018

я исправил эту проблему, комментируя:

builder.RegisterWebApiFilterProvider(config);

и

builder.RegisterHttpRequestMessage(config);

в AutofacDi

...