Я пытаюсь использовать AutoMapper с веб-приложением, работающим на IIS 7. Предполагается использовать его для сопоставления типов доменов, определенных во внешней DLL, для просмотра моделей, определенных в приложении IIS. Это работает хорошо, за исключением случаев, когда внешняя DLL поет. Тогда я получаю следующую ошибку:
AutoMapper.AutoMapperMappingException was unhandled by user code
Message="Trying to map TestLibrary.Source to WebApplication1.Destination.\nUsing mapping configuration for TestLibrary.Source to WebApplication1.Destination\nException of type 'AutoMapper.AutoMapperMappingException' was thrown."
Source="AutoMapper"
StackTrace:
at AutoMapper.MappingEngine.AutoMapper.IMappingEngineRunner.Map(ResolutionContext context)
at AutoMapper.MappingEngine.Map(Object source, Type sourceType, Type destinationType)
at AutoMapper.MappingEngine.Map[TSource,TDestination](TSource source)
at AutoMapper.Mapper.Map[TSource,TDestination](TSource source)
at WebApplication1._Default.Page_Load(Object sender, EventArgs e)
at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
at System.Web.UI.Control.OnLoad(EventArgs e)
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
InnerException: AutoMapper.AutoMapperMappingException
Message="Trying to map TestLibrary.Source to System.Object.\nUsing mapping configuration for TestLibrary.Source to WebApplication1.Destination\nDestination property: Value\nException of type 'AutoMapper.AutoMapperMappingException' was thrown."
Source="AutoMapper"
StackTrace:
at AutoMapper.Mappers.TypeMapObjectMapperRegistry.PropertyMapMappingStrategy.MapPropertyValue(ResolutionContext context, IMappingEngineRunner mapper, Object mappedObject, PropertyMap propertyMap)
at AutoMapper.Mappers.TypeMapObjectMapperRegistry.PropertyMapMappingStrategy.Map(ResolutionContext context, IMappingEngineRunner mapper)
at AutoMapper.Mappers.TypeMapMapper.Map(ResolutionContext context, IMappingEngineRunner mapper)
at AutoMapper.MappingEngine.AutoMapper.IMappingEngineRunner.Map(ResolutionContext context)
InnerException: System.Security.SecurityException
Message="Request failed."
Source="Anonymously Hosted DynamicMethods Assembly"
StackTrace:
at lambda_method(ExecutionScope , Object )
at AutoMapper.Internal.PropertyGetter.GetValue(Object source)
at AutoMapper.Internal.MemberGetter.Resolve(ResolutionResult source)
at AutoMapper.PropertyMap.ResolveValue(Object input)
at AutoMapper.Mappers.TypeMapObjectMapperRegistry.PropertyMapMappingStrategy.MapPropertyValue(ResolutionContext context, IMappingEngineRunner mapper, Object mappedObject, PropertyMap propertyMap)
InnerException:
Действия по воспроизведению проблемы:
1) Создайте новое веб-приложение с помощью Visual Studio 2008 на компьютере с установленным IIS 7. (Мы используем Windows 7).
2) Загрузите файл AutoMapper.dll с http://www.codeplex.com/AutoMapper. (мы используем версию 0.4.x.x) и добавьте ссылку на этот Dll в свое веб-приложение.
3) Поместите следующий код в код позади страницы по умолчанию:
using System;
using AutoMapper;
using TestLibrary;
namespace WebApplication1
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Mapper.CreateMap<Source, Destination>();
Mapper.AssertConfigurationIsValid();
var source = new Source {Value = "Automapper works!" };
var destination = Mapper.Map<Source, Destination>(source);
Response.Clear();
Response.ContentType="text/plain";
Response.Write(destination.Value);
Response.End();
}
}
public class Destination
{
public object Value { get; set; }
}
4) Создайте новую библиотеку классов с именем «TestLibrary», переименуйте файл Class1.cs в Source.cs и поместите в него следующий код:
namespace TestLibrary
{
public class Source
{
public object Value { get; set; }
}
}
5) Добавьте ссылку на эту библиотеку в ваше веб-приложение.
6) Запустите решение, и вы должны увидеть «Automapper works!» выход.
7) Чтобы это не получилось, нужно сделать две вещи.
i) Настройте веб-сайт для работы под IIS вместо сервера разработки Visual Studio.
ii) Подпишите сборку TestLibrary.
После этого запуск решения должен вызвать ошибку, указанную выше.
У кого-нибудь есть идеи, как обойти это? Мы проверили, и приложение работает с полным доверием в соответствии с консолью управления IIS.