Как записать данные в виде ответа Json на HttpResponse в .NET Core - PullRequest
2 голосов
/ 11 декабря 2019

Мой код выглядит следующим образом:

public override void OnActionExecuting(ActionExecutingContext actionContext)
{
    object[] eventGridMessages = (object[])actionContext.ActionArguments.FirstOrDefault().Value;

    if (eventGridMessages == null || (eventGridMessages != null && eventGridMessages.Length <= 0))
    {
        throw new ArgumentNullException("eventGridMessages", "eventGridMessages parameter cannot be empty.");
    }

    if (actionContext.HttpContext.Request.Headers.ContainsKey("aeg-event-type") && actionContext.HttpContext.Request?.Headers["aeg-event-type"].ToString() == "SubscriptionValidation")
    {
        actionContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.OK;
        var x = this.GetValidationCodeResponse(eventGridMessages[0].ToString());
        actionContext.HttpContext.Response.ContentType = "application/json";
        actionContext.HttpContext.Response.Body = new MemoryStream(Encoding.UTF8.GetBytes(x, 0 , x.Length));
    }

    return;
}

/// <summary>
/// Gets the validation code response.
/// </summary>
/// <param name="validationRequest">The validation request.</param>
/// <returns>Validation Response Message</returns>
private string GetValidationCodeResponse(string validationRequest)
{
    var validationRequestJson = JsonConvert.DeserializeObject<CustomEvent<EventSubscritionValidationCode>>(Convert.ToString(validationRequest));
    var validationResponse = JsonConvert.SerializeObject(new { validationResponse = "644e4387-465f-46ee-8df9-b5330c3bda69" });

    return validationResponse;
}

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

actionContext.Response = new HttpResponseMessage   
{
    StatusCode = HttpStatusCode.OK,
    Content = new StringContent("JSON data")
}

, но в .NET Core он был изменен на HttpResponse, и это абстрактный класс, в котором яне могу создать экземпляр, и я не могу установить ответ JSON на HttpResponse.

Я не могу увидеть свои данные JSON (GUID) на HttpResponse.

Может кто-то помочьмне с этим ??

1 Ответ

2 голосов
/ 11 декабря 2019

Вы можете использовать JsonResult . Способ короткого замыкания Result from WebApi состоит в том, чтобы установить значение context.Result, поэтому в вашем случае

 if (actionContext.HttpContext.Request.Headers.ContainsKey("aeg-event-type") && actionContext.HttpContext.Request?.Headers["aeg-event-type"].ToString() == "SubscriptionValidation")
 {
     // JsonResult handles the serialization for you.
     actionContext.Result = new JsonResult(new { validationResponse = "644e4387-465f-46ee-8df9-b5330c3bda69" });
 }

Согласно документации в контексте действия здесь :

Result

Получает или задает IActionResult для выполнения. Установка Результата в ненулевое значение внутри фильтра действия приведет к короткому замыканию действия и любых оставшихся фильтров действия.

Существует несколько других типов IActionResult, таких как BadRequestResult (400),NotFoundResult (404) и OkObjectResult (200) и более.

Если вы хотите передать данные контроллеру, вы можете сделать это:

filterContext.HttpContext.Items["validationResponse"] = validationResponse;

Тогда вы можете получитьдополнительные поля и добавьте их в своем контроллере к ответу в фильтре после выполнения, где ваш ответ не переопределит тот, который установлен в фильтре.

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