2

我有一个简单的 WebAPI 控制器。我添加了 AutoMapper nuget 包,用于在 DataModel 类型和相应的 Dto 类型之间进行映射,如下所示:

namespace WebApi.Controllers
{
  public class Contact
  {
    public int ID { get; set; }
    public string Name { get; set; }
  }

  public class ContactDto
  {
    public int ID { get; set; }
    public string Name { get; set; }
  }

  public class ValuesController : ApiController
  {
      public ValuesController()
      {
        SetupMaps();
      }

      private void SetupMaps()
      {  
         Mapper.CreateMap<ContactDto, Contact>();
         Mapper.CreateMap<Contact, ContactDto>()
            .AfterMap((c, d) =>
                {
                    //Need to do some processing here
                    if (Request == null)
                    {
                        throw new ArgumentException("Request was null!");
                    }
                }
        );
      }

      public ContactDto Get(int id)
      {
        Contact c = new Contact { ID = id, Name = "test" };
        ContactDto dto = Mapper.Map<Contact, ContactDto>(c);
        return dto;
      }
   }
 }

我想在映射完成后运行一些逻辑并且需要在“AfterMap”中使用 HttpRequestMessage 对象

当我从 Fiddler 中点击 ValuesController 时,它会按预期返回 Dto 的 JSON 表示。如果我同时发出一堆请求来模拟负载并到达端点,那么乐趣就开始了;有些请求成功,有些失败,因为 HttpController 的“Request”属性为空!问题是为什么 Request 为空?

我也尝试过使用异步控制器方法并且行为是相同的:

    private async Task<Contact> GetContact(int id)
    {
        Task<Contact> task = Task.Factory.StartNew<Contact>(
            () => new Contact { ID = id, Name = "test" }
            );
        return await task;
    }
    public async Task<ContactDto> Get(int id)
    {
        Contact c = await GetContact(id);
        ContactDto dto = Mapper.Map<Contact, ContactDto>(c);
        return dto;
    }

我附上了 Fiddler 调用的屏幕截图,表明一些请求以 200 成功,并且当 HttpRequestMessage 为空时调用失败时 Visual Studio 中的调试器中断。

提琴手调用

调试器中断-1

调试器中断-2

关于为什么会发生这种情况的任何见解?

4

1 回答 1

0

我认为您不应该使用Request构造函数中的属性。控制器可以在上下文可用之前初始化。

尝试将AfterMap委托重构为单独的方法并在调用后调用它ContactDto dto = Mapper.Map<Contact, ContactDto>(c);

于 2013-10-25T21:33:19.843 回答