Как сгенерировать параметры тела/образец запроса для страницы справки веб-API, имея доступ к необработанному телу запроса

Мне нужна помощь в заполнении параметров тела для документации этой конечной точки. Он отображается как пустой:

Справочная страница веб-API

Я понимаю, что это происходит потому, что я в настоящее время читаю тело запроса, а затем преобразовываю информацию в PackageUpdate. Поскольку я таким образом читаю необработанное тело запроса, у задачи нет параметров, из-за которых страница справки не укажет ни одного.

Sample Request:

{
  "PackageId": "package/3e585e1c-d6cd-4b6c-aa1c-aa674d11c944",
  "SoldDateTime": "2018-08-13 19:57:54.000",
  "GuaranteeTermExpiresDate": null
}

PackageUpdate class:

    [DataContract]
    public class PackageUpdate: BaseRequest
    {
        /// <summary>
        ///     Get or Set the package ID of the package to update
        /// </summary>
        [Required]
        [DataMember]
        public string PackageId { get; set; }

        /// <summary>
        ///     Get or Set the Sold Date Time field of the package
        /// </summary>
        [DataMember]
        public DateTime? SoldDateTime { get; set; }

        /// <summary>
        ///     Get or Set the Guarantee Term Expires Date field of the package
        /// </summary>
        [DataMember]
        public DateTime? GuaranteeTermExpiresDate { get; set; }

        /// <summary>
        ///     Get or Set the Premium Promised On field of the package
        /// </summary>
        [DataMember]
        public DateTime? PremiumPromisedOn { get; set; }
    }

UpdatePackageAsync Method:

        /// <summary>
        ///     Updates a package.
        /// </summary>
        [Route("update"), Description("Patch a specific package")]
        [HttpPatch]
        [ResponseType(typeof(Package))]
        public async Task<IHttpActionResult> UpdatePackageAsync()
        {
            string requestBody = await Request.Content.ReadAsStringAsync();
            PackageUpdate request = new PackageUpdate();

            try
            {
                JsonSerializerSettings settings = new JsonSerializerSettings{ MissingMemberHandling = MissingMemberHandling.Error };
                request = JsonConvert.DeserializeObject<PackageUpdate>(requestBody, settings);
            }   
            catch(Exception e)
            {
                return BadRequest("Patch Error -> " + e.Message);
            }

            //Do stuff with request

        }

Как я могу получить поле «Параметры тела» в документации, чтобы оно отражало свойства PackageUpdate, и при этом иметь доступ к необработанному телу запроса?

Ранее я пробовал приведенное ниже решение из другого сообщения, но оно не позволяло мне получить доступ к телу запроса в виде строки.

public async Task<IHttpActionResult> UpdatePackageAsync([FromBody] PackageUpdate request)

person Brandon Lumsden    schedule 10.01.2020    source источник
comment
Любое понимание этой проблемы? Если мне нужно предоставить более четкую информацию, пожалуйста, дайте мне знать.   -  person Brandon Lumsden    schedule 13.01.2020


Ответы (1)


В итоге я попробовал несколько решений, которые нашел на сайте, а затем нашел решение (здесь), которое позволяет мне искать начало потока, скопировать в новый поток и вернуть тело в мою задачу.

Решение:

using (var stream = new MemoryStream())
{
    var context = (HttpContextBase)Request.Properties["MS_HttpContext"];
    context.Request.InputStream.Seek(0, SeekOrigin.Begin);
    context.Request.InputStream.CopyTo(stream);
    string requestBody = Encoding.UTF8.GetString(stream.ToArray());
}

Применительно к моему коду я использовал его следующим образом:

public async Task<IHttpActionResult> UpdatePackageAsync(PackageUpdate request)
{
     string requestBody = ReadInputStream();
     // do stuff with request
}

private string ReadInputStream()
{
      using (var stream = new MemoryStream())
      {
           var context = (HttpContextBase)Request.Properties["MS_HttpContext"];
           context.Request.InputStream.Seek(0, SeekOrigin.Begin);
           context.Request.InputStream.CopyTo(stream);
           return Encoding.UTF8.GetString(stream.ToArray());
      }
}
person Brandon Lumsden    schedule 13.01.2020