自动映射 - 达到Apppool空闲超时 - 缺少映射

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自动映射 - 达到Apppool空闲超时 - 缺少映射相关的知识,希望对你有一定的参考价值。

目前我坚持使用apppool超时和自动播放器。

在我的Global.asax中,我在Application_start函数中编写了以下代码。

Mapper.Initialize(cfg =>
{
    cfg.CreateMissingTypeMaps = false;

    cfg.CreateMap<string, MvchtmlString>()
    .ConvertUsing<MvcHtmlStringConverter>();

    // Get all my project assemblies
    Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies().Where(
      x => x.GetName().Name.StartsWith("MyMvcApplication.")).ToArray();

    // Add all assemblies to automapper to search for defined profiles.
    cfg.AddProfiles(assemblies);
});

首先,如果我重建我的mvc项目并访问我的页面,它可以正常工作。来自许多程序集的所有映射都按预期定义。

现在的问题是:如果我正在等待apppool超时(例如定义为5分钟)并在5分钟后访问我的网站,我会得到一些“AutoMapper.AutoMapperMappingException:缺少类型映射配置或不支持的映射”。如果自动化程序试图从除主程序集之外的程序集映射某些模型。

解决方案结构

  • MyMvcApplication.DataAccess 实体
  • MyMvcApplication.Services ServiceModels AutoMapperProfiles
  • MyMvcApplication.Web 楷模 AutoMapperProfiles

Web中的AutoMapper配置文件中定义的所有映射(在Web项目和服务项目中引用模型)仍然在automapper中定义。

来自服务项目的AutoMapper配置文件中定义的所有映射(引用服务模型和实体)在自动化程序中都是MISSING。

如果我正在调用“Mapper.Configuration.GetAllTypeMaps()”我得到以下结果在超时之前:{AutoMapper.TypeMap[30]}超时后:{AutoMapper.TypeMap[13]}

因此,在apppool开始睡眠后,automapper会丢失他的映射。

automapper配置文件的示例:

namespace MyMvcApplication.Services.MappingProfiles
{
    using AutoMapper;
    using MyMvcApplication.DataAccess.DAL;
    using MyMvcApplication.Services.Models.Users;

    public class UserMappingProfile : Profile
    {
        public UserMappingProfile()
        {
            base.CreateMap<UserEntity, User>();
            base.CreateMap<UserEntity, BasicUser>();
            base.CreateMap<UserEntity, OverviewUser>();
            base.CreateMap<UserEntity, LoginUser>();
        }
    }
}

有谁知道我在使用automapper实现时遇到了什么问题?

最好的祝福

答案

我明白了,发现了自己的错误。在AutoMapper.Initialize我写了“AppDomain.CurrentDomain.GetAssemblies()”这导致了appool recyle之后的问题。相反,我必须使用“BuildManager.GetReferencedAssemblies()”来获取所有程序集,如果它们当前未加载。

参考链接解决我的问题:https://stackoverflow.com/a/2479400/10236859

以上是关于自动映射 - 达到Apppool空闲超时 - 缺少映射的主要内容,如果未能解决你的问题,请参考以下文章

Derby/JDBC 连接生命周期(或空闲超时)

IIS7 中的 DefaultAppPool 和 Classic .NET AppPool 有啥区别?

如何在 Redis 上杀死 Node 打开的空闲客户端?

如何在 reactor-netty 中配置池连接空闲超时

MySQL超时配置

MySql连接空闲8小时自动断开的原因及连接池配置方法