私はAspnet Core 1.1でAPIを書いていましたが、すべてのリクエストは単一ルートへのポストリクエストでなければならず、ボディペイロードのタイプに応じて、私はActionMethodSelectorAttribute
を継承し、IsValidForRequest
を継承して、単純なアプローチであると予想されるタイプを渡すアクションを装飾していますが、動作させると問題が発生します。RouteContext.HttpContext.Request.Body
これはStreamオブジェクトであり、さらにデシリアライズしようとする例外を避けるためにキャッシュを使用しましたが、アクションが選択されるとすぐに、本体はすでに消費されており、再度シリアライズしてモデルバインダーに使用することはできません。Aspnetコアの複雑なパラメータでアクションを選択
public override bool IsValidForRequest(RouteContext routeContext, ActionDescriptor action)
{
try
{
var body = new MemoryStream();
routeContext.HttpContext.Request.Body.CopyTo(body);
body.Position = 0;
XmlDocument xmlDoc = new XmlDocument();
var xml = XDocument.Load(body);
var messageName = xml.Root.Name.LocalName;
return messageName == _messageType.Name;
}
catch (Exception ex)
{
return false;
}
}
[MessagBasedControllerActionSelector(typeof(OTA_HotelInvCountRQ))]
public async Task<IActionResult> OTA_HotelInvCount([FromBody]OTA_HotelInvCountRQ request)
{
var response = await _otaService.OTA_HotelInvCountRQ(request, GetExternalProviderId());
return Ok(response);
}
私はこのアプローチが規模に関係なく、私の要求を満たす別の解決策または1つを聞いてうれしいことを知っています。