【问题标题】:Automapper - Apppool Idle Timeout reached - Missing mappingAutomapper - 达到 Apppool 空闲超时 - 缺少映射
【发布时间】:2019-02-08 00:55:23
【问题描述】:

目前我坚持使用 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

    • 服务模型
    • AutoMapperProfiles
  • MyMvcApplication.Web

    • 型号
    • AutoMapperProfiles

AutoMapperProfiles 中定义的所有映射在 Web 项目和服务项目中引用模型的 Web 仍然在 automapper 中定义。

Service 项目的 AutoMapperProfiles 中定义的所有引用 ServiceModels 和 Entites 的映射在 automapper 中都丢失了。

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

所以在应用池开始休眠后,自动映射器会丢失他的映射。

自动映射器配置文件示例:

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

有人知道我在执行自动映射器时做错了什么吗?

最好的问候

【问题讨论】:

  • 可能您传递给 AddProfiles 的列表没有您第二次需要的内容。
  • 不,当我在网站上活跃冲浪时,多次调用相同/不同的页面并映射其工作正常.. 因为我正在等待 apppool 超时......所以你的意思是“第二次”?
  • 超时后。

标签: timeout mapping automapper


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2012-10-02
    • 1970-01-01
    • 2017-06-02
    • 2018-11-15
    • 1970-01-01
    • 2019-03-01
    • 2017-04-16
    • 2015-09-22
    • 1970-01-01
    相关资源
    最近更新 更多