我有一个简单的 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 中的调试器中断。
关于为什么会发生这种情况的任何见解?