Проблема с AutoMapper в IIS7 при использовании подписанных сборок - PullRequest
3 голосов
/ 16 ноября 2009

Я пытаюсь использовать 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.

1 Ответ

2 голосов
/ 24 декабря 2009

Таким образом, это исключение происходит от программного создания лямбда-выражения и последующей его компиляции. Можете ли вы попробовать сделать то же самое, только в Default.aspx.cs? Один из способов сделать это - создать лямбда-выражение в коде:

Выражение> expr = () => 5;

затем выполните:

var func = expr.Compile ();

это такая линия, которая тебе не подходит.

Если это сработает, я бы затем поместил этот код в подписанную сборку и получил к нему доступ из веб-приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...