JsonResult и ObjectResult не являются производными друг от друга - почему? - PullRequest
0 голосов
/ 16 мая 2019

ребята из моей команды пишут такие вещи:

[HttpPost("do")]
public async Task<ActionResult> DoAsync()
{
    try
    {
        var obj = await this.DoThing();

        return new JsonResult(obj);
    }
    catch (StatusCodeException x)
    {
        return StatusCode(x.StatusCode, new { x.Message, x.StackTrace });
    }
    catch (Exception x)
    {
        return StatusCode(500, x.GenerateMessage(" "));
    }
}

Это означает, что JsonResult или ObjectResult могут быть возвращены, что усложняет тестирование. Это потому, что JsonResult и ObjectResult не не происходят друг от друга. Кто-нибудь знает, почему это так?

Мне пришлось написать небольшой класс-обертку для тестирования, чтобы сделать жизнь немного проще:

/// <summary>
/// Defines all subclasses of <see cref="ActionResult"/>
/// that have status codes and <see cref="object"/> values.
/// </summary>
public class ObjectValueActionResult
{
    /// <summary>
    /// Initializes a new instance of the <see cref="ObjectValueActionResult"/> class.
    /// </summary>
    /// <param name="result">The result.</param>
    /// <remarks>
    /// The majority of <see cref="IActionResult"/> instances like <see cref="OkObjectResult"/> derive
    /// from <see cref="ObjectResult"/>.
    /// </remarks>
    public ObjectValueActionResult(IActionResult result)
    {
        Assert.NotNull(result);
        switch (result)
        {
            case JsonResult j:
                this.Value = j.Value;
                this.StatusCode = j.StatusCode;
                break;
            case NoContentResult n:
                this.StatusCode = n.StatusCode;
                break;
            case ObjectResult o:
                this.Value = o.Value;
                this.StatusCode = o.StatusCode;
                break;
            default:
                throw new NotImplementedException($"The expected {nameof(IAsyncResult)} type is not here.");
        }
    }
    /// <summary>
    /// Gets or sets the value.
    /// </summary>
    /// <value>
    /// The value.
    /// </value>
    public object Value { get; set; }
    /// <summary>Gets or sets the HTTP status code.</summary>
    public int? StatusCode { get; set; }
}

Есть ли альтернатива этому?

1 Ответ

2 голосов
/ 16 мая 2019

JsonResult предназначен для возврата данных в формате JSON, он возвращает JSON независимо от того, какой формат запрашивается через заголовок Accept.Когда мы используем JsonResult, согласование содержимого не происходит.

Согласование содержимого - это процесс определения типа браузера данных, запрошенного через заголовок Accept запроса Http.Например, это заголовок accept, который запрашивает содержимое типа HTML: Accept: application/xml, */*; q=0.01, с результатами действий типа JsonResult согласование содержимого не выполняется.Это означает, что сервер игнорирует запрашиваемый пользователем тип и возвращает JSON.

ObjectResult - это IActionResult, в который встроено согласование содержимого. Обычно, если вы не укажете заголовок Accept, API будет сериализовать ответ как JSON.Например, если вы укажете «application / xml», он вернет XML.

Ссылка:

http://hamidmosalla.com/2017/03/29/asp-net-core-action-results-explained/

https://docs.microsoft.com/en-us/aspnet/core/web-api/advanced/formatting?view=aspnetcore-2.2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...