Как принять GET-запрос без тела с JSON как тип контента? - PullRequest
7 голосов
/ 04 ноября 2019

После перехода на ASP.NET Core 2.1 мы поняли, что некоторые потребители нашего API отправляют запросы GET с заголовком Content-Type, установленным в application/json. К сожалению, эти запросы не были отклонены в прошлом (даже если они должны были), тем не менее, это все еще является серьезным изменением.

Поскольку наши потребители должны решить эту проблему с их стороны, и это потребуетНекоторое время мы хотели бы временно принять эти запросы, чтобы не застревать в ожидании этого.

Каркас (правильно) отклоняет запрос со следующим сообщением об ошибке: "A non-empty request body is required."

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

[Route("api/file/{id:guid}")]
public async Task<IActionResult> Get(Guid id)
{
     // Some simple code here
}

Код внутри действия не достигается, так как ошибка уже была выдана до того, как она достигает действия (из-за неправильного запроса).

* 1014Решение * @ Nkosi привело к тому же ответу:
[HttpGet("api/file/{id:guid}")]
public async Task<IActionResult> Get([FromRoute]Guid id)
{
     // Some simple code here
}

(PHP) cURL, который использует потребитель:

$ch = curl_init(self::API_URL."/file/".$id);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    "Content-Type: application/json",
    "Application: APPKey ".$this->AppKey,
    "Authorization: APIKey ".$this->ApiKey
));

Удаление строки "Content-Type: application/json", превращает запрос вдействительные запросы, поэтому мы на 99,9% уверены, что добавление этого заголовка является злодеем.

1 Ответ

3 голосов
/ 04 ноября 2019

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

public void Configure(IApplicationBuilder app) {
    app.Use(async (context, next) => {
        var request = context.Request;
        var method = request.Method;
        IHeaderDictionary headers = request.Headers;
        string key = "Content-Type";
        if (method == "GET" && request.Headers.ContainsKey(key)) {
            headers.Remove(key);
        }

        // Call the next delegate/middleware in the pipeline
        await next();
    });

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