2

シンプルな WebAPI コントローラーがあります。次のように、DataModel 型と対応する Dto 型の間をマッピングするための AutoMapper nuget パッケージを追加しました。

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" プロパティが null であるため、成功する要求と失敗する要求があります。質問は、なぜ Request が null なのですか?

非同期コントローラー メソッドも使用してみましたが、動作は同じです。

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

いくつかのリクエストが 200 で成功したことを示す Fiddler 呼び出しのスクリーンショットを添付し、HttpRequestMessage が null のときに呼び出しが失敗すると、Visual Studio でデバッガーが中断します。

フィドラー呼び出し

デバッガー速報-1

デバッガー速報-2

なぜこれが起こっているのかについての洞察はありますか?

4

1 に答える 1