【问题标题】:Refit - How to have OPTIONAL dynamic headers改装 - 如何拥有可选的动态标题
【发布时间】:2020-01-10 05:57:16
【问题描述】:

我正在使用 Refit 并希望为某些方法设置可选的动态标头。例如,如果用户已登录,我想要标题“UserId”和“AuthenticationToken”,否则不要设置标题

[Post("/search")]
Task<SearchResponse> Search([Body]SearchRequest request, [Header("UserId")] string userId,[Header("AuthorizationToken")] string token);

不确定我是否将空值传递给 userId 和令牌,这两个标头将具有空值或只是被跳过(不包含在标头中)?

谢谢。

【问题讨论】:

  • 您发布的内容读取请求的标头,它不会设置响应的标头。无论如何,您要问的是authentication middleware 的工作。您在启动时配置令牌、cookie 等,中间件将阻止任何未经授权的操作调用。如果请求不包含应有的内容,则不会调用Search
  • 我想我通过阅读 Refit 源代码得到了答案。它将忽略(跳过)空值标头。这意味着如果我将空值传递给“userId”或“token”,它将尝试删除现有的标头并完成!

标签: c# refit


【解决方案1】:

使用 refit,您可以实现 DelegatingHandler,然后注册它以在发送之前对 http 请求执行任何您需要的操作。这是为每个请求添加一个原始标头。改装接口不用担心。

public class AddOriginHeaderToRequest : DelegatingHandler
    {
        private const string ServiceNameSettingLocation = "AppConfig:Logging:ServiceName";

        private readonly IHttpContextAccessor httpContextAccessor;

        private readonly IConfiguration configuration;

        public AddOriginHeaderToRequest(IHttpContextAccessor httpContextAccessor, IConfiguration configuration)
        {
            this.httpContextAccessor = httpContextAccessor;
            this.configuration = configuration;
        }

        protected override async Task<HttpResponseMessage> SendAsync(
            HttpRequestMessage request,
            CancellationToken cancellationToken)
        {
            var origin = this.configuration[AddOriginHeaderToRequest.SomethingThatShouldBeDefined];

            if (!(request.Headers.Contains("origin") || request.Headers.Contains("Origin")) && origin != null)
            {
                request.Headers.Add("origin", origin);
            }

            return await base.SendAsync(request, cancellationToken);
        }
    }

然后像这样注册:

services.AddTransient<AddOriginHeaderToRequest>();

然后可以像这样注册改装客户端(这是我们的一个 nuget 包的修订版本,因此希望能够了解它是如何工作的):

public static IHttpClientBuilder AddHttpClientWithDefaultHandlers(
            this IServiceCollection services,
            string name,
            Action<HttpClient> configureClient)
        {
            return services.AddHttpClient(name, configureClient)
                .AddHttpMessageHandler<AddOriginHeaderToRequest>();
        }

然后在我们的服务中,我们像这样注册我们的改装处理程序:

services.AddHttpClientWithRefitAndDefaultHandlers<ImyHttpClient>(
                "myHttpClient",
                c =>
                {
                    c.BaseAddress = new Uri(appSettings.Value.AppConfig.SomeUrl);
                });

这可以简化,但我们有许多不同的处理程序以标准方式处理我们的 http 请求。

我希望这能给你一个关于它如何工作的指导。

【讨论】:

    猜你喜欢
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多