Пакетные запросы токена на предъявителя

После настройки поддержки пакетных запросов в моем веб-приложении .NET Framework. Возврат каждого отдельного запроса запрещен, даже если я копирую свой токен на предъявителя в каждый из отдельных запросов. Мой интеграционный тест для моей пакетной поддержки приведен ниже - мой код ServerHelper добавляет токен-носитель в запросы.

[TestMethod]
public async Task BatchRequestTest()
{
    var requestMessage = new HttpRequestMessage(HttpMethod.Get, ServerHelper.HttpClient.BaseAddress + "values/22");

    requestMessage.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", await ServerHelper.GetAccessToken());

    var getMetricsRequest = new HttpMessageContent(requestMessage);
    var getTransactionsRequest1 = new HttpMessageContent(new HttpRequestMessage(HttpMethod.Get, ServerHelper.HttpClient.BaseAddress + "values/23"));
    var failingRequest = new HttpMessageContent(new HttpRequestMessage(HttpMethod.Get, ServerHelper.HttpClient.BaseAddress + "values/77"));
    MultipartContent content = new MultipartContent("mixed", "batch_" + Guid.NewGuid().ToString());

    content.Add(getMetricsRequest);
    content.Add(getTransactionsRequest1);
    content.Add(failingRequest);


    HttpRequestMessage batchRequest = new HttpRequestMessage(HttpMethod.Post, ServerHelper.HttpClient.BaseAddress + "batch")
    {
        Content = content
    };

    var response = await ServerHelper.HttpClient.SendAsync(batchRequest);
    Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);//assert true


    var responseContents = await response.Content.ReadAsMultipartAsync();

    var get1 = await responseContents.Contents[0].ReadAsHttpResponseMessageAsync();
    var get2 = await responseContents.Contents[1].ReadAsHttpResponseMessageAsync();
    var get3 = await responseContents.Contents[2].ReadAsHttpResponseMessageAsync();


    Assert.AreEqual(HttpStatusCode.OK, get1.StatusCode);//assert fail
    Assert.AreEqual(HttpStatusCode.OK, get2.StatusCode);//assert fail
    Assert.AreEqual(HttpStatusCode.NotFound, get3.StatusCode);
}

Часть моей конфигурации, отвечающая за добавление пакетной поддержки:

var server = new HttpServer(httpConfiguration);

appBuilder.UseWebApi(server);

httpConfiguration.Routes.MapHttpBatchRoute(
    routeName: "batch",
    routeTemplate: "batch",
    batchHandler: new DefaultHttpBatchHandler(server)
    {
        ExecutionOrder = BatchExecutionOrder.NonSequential
    }
);

Мне нужно что-то добавить в мою воронку?


person cjp    schedule 16.10.2017    source источник
comment
Эй, ты нашел решение для этого? У меня такая же проблема, и мне нужно установить токен-носитель для моих пакетных запросов.   -  person ObiEff    schedule 01.12.2017


Ответы (2)


Обратите внимание, что вы добавили заголовок авторизации в другую локальную переменную с именем requestMessage. Попробуйте добавить заголовок авторизации в вашу batchRequest переменную и / или создайте другие экземпляры HttpMessageContent с requestMessage в качестве аргумента конструктора.

person jorgonor    schedule 16.10.2017
comment
Я не понял, когда вставил свой код. Но Serverhelper добавляет заголовок авторизации к пакетному запросу. Упомянутый вами шаг - это эксперимент по проверке добавления токена-носителя к одному из внутренних запросов. У меня не было бы несанкционированной проблемы. - person cjp; 17.10.2017

Сегодня столкнулся с этой проблемой, поэтому подумал, что опубликую решение, если кто-то еще задается вопросом. Вы можете создать собственный пакетный обработчик, расширив DefaultHttpBatchHandler. Затем вы можете установить заголовки авторизации для дочерних запросов.

public class AuthorizationBatchHandler : DefaultHttpBatchHandler
{
    public AuthorizationBatchHandler(HttpServer httpServer) : base(httpServer)
    {
    }

    public override async Task<IList<HttpRequestMessage>> ParseBatchRequestsAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var requests = await base.ParseBatchRequestsAsync(request, cancellationToken);

        foreach (var childRequest in requests)
        {
            childRequest.Headers.Authorization = request.Headers.Authorization;
        }
        return requests;
    }
}

Затем вы подключаете его к своему методу запуска следующим образом:

        httpConfiguration.Routes.MapHttpBatchRoute(
            routeName: "batch",
            routeTemplate: "batch",
            batchHandler: new AuthorizationBatchHandler(server));

Это все, что нужно сделать.

person ObiEff    schedule 01.12.2017