【问题标题】:Batch Requests Bearer Token批量请求不记名令牌
【发布时间】:2017-10-16 10:29:54
【问题描述】:

在我的 .net 框架 Web 应用中设置对批处理请求的支持之后。每个单独的请求都返回禁止,即使我将我的不记名令牌复制到每个单独的请求。 我对批处理支持的集成测试如下 - 我的 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
    }
);

我需要在我的管道中添加一些东西吗?

【问题讨论】:

  • 嘿,您找到解决方案了吗?我遇到了同样的问题,需要在我的批处理请求中设置不记名令牌。

标签: c# .net bearer-token


【解决方案1】:

请注意,您将 Authorization 标头添加到另一个名为 requestMessage 的局部变量中。尝试将授权标头添加到您的 batchRequest 变量和/或使用 requestMessage 作为构造函数参数创建其他 HttpMessageContent 实例。

【讨论】:

  • 我在粘贴代码时并不清楚。但是 Serverhelper 将 Authorization Header 添加到批处理请求中。您提到的那一步是检查是否将不记名令牌添加到 inner 请求之一的实验。我不会有未经授权的问题。
【解决方案2】:

今天遇到了这个问题,所以我想我会发布一个解决方案,以防其他人对此感到疑惑。您可以通过扩展 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));

这就是所有要做的事情。

【讨论】:

    猜你喜欢
    • 2020-12-11
    • 2020-01-24
    • 1970-01-01
    • 2021-08-02
    • 2017-03-20
    • 2021-05-18
    • 2013-07-03
    • 2020-11-24
    • 1970-01-01
    相关资源
    最近更新 更多