首页 > 解决方案 > HttpClient 401 在生产中但在 ID 中运行时没有

问题描述

目前我们有两个网络服务器,一个设置只提供 API 端点。另一个就像一个传统的网站。让我将它们称为 API 服务器和 Web 服务器。

据我们所知,API 服务器中使用的端点正在工作,当我们使用浏览器并输入登录详细信息时,它会显示结果。它适用于邮递员,在 VS 2019 IDE 中运行 Web 服务器时也适用。

在 docker 容器中运行时它不起作用。

运行以调用 API 端点的 Web 服务器应用程序正在使用 .NET Core 3.1,这是应用程序遇到的问题。

代码本身是

private static readonly HttpClient client = new HttpClient();

                client.DefaultRequestHeaders.Accept.Clear();
                client.BaseAddress = new Uri(Settings.envApiBaseUrl);

                string URL = $"search?search-text=Amarajith";

                var byteArray
                    = Encoding.ASCII.GetBytes($"{Settings.envApiUsername}:{Settings.envApiPassword}");

                client.DefaultRequestHeaders.Authorization
                    = new AuthenticationHeaderValue(
                        "Basic",
                        Convert.ToBase64String(byteArray));

                getRequestTask = client.GetStringAsync(URL);

                msg = await getRequestTask;

我们看到的问题是

Response status code does not indicate success: 401 (). at System.Net.Http.HttpResponseMessage.EnsureSuccessStatusCode() at System.Net.Http.HttpClient.GetStringAsyncCore(Task`1 getTask) at Web.Controllers.WebApiTestController.TestEngineApiAsync() in /src/MatchmakingWeb/Controllers/WebApiTestController.cs:line 82 System.Net.Http

需要明确的是,API 服务器似乎正在运行运行上述代码以从 API 端点获取结果的 Web 服务器不起作用。

我查看了 stackoverflow 的答案和其他一些网络资源。这个(HttpClient 不接受授权标头(401 Unauthorized)?)似乎更相关,但我似乎已经将其用作上述解决方案的一部分。大多数情况下,我还没有找到我需要帮助我的东西。

我已确认设置中的用户名和密码正确。我也在调试模式下尝试了有效的 URL。

ConfigureServices(IServiceCollection services)

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersWithViews();
            services.AddCors(options =>
            {
                options.AddPolicy(name: MyAllowSpecificOrigins,
                    builder =>
                    {
                        builder.WithOrigins("https://dummy-url");                        
                    });
            });
            services.AddDataProtection();
        }

Configure(IApplicationBuilder app, IWebHostEnvironment env)

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (!env.IsDevelopment())   app.UseHsts();

            app.UseDeveloperExceptionPage();
            app.UseCors(MyAllowSpecificOrigins);
            app.UseHttpsRedirection();
            app.UseStaticFiles();       
            app.UseRouting();
            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
            });
        }

启动网站的类是

    public class Program
    {
        public static void Main(string[] args)
        {
            // TODO sort out the DI for the DB

            CreateHostBuilder(args).Build().Run();

        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                    webBuilder.UseSetting("http_port", "1980");
                });
    }

任何帮助和指示将不胜感激。WebAPI 服务器启用了 CORS,以防万一。

Web 应用程序和 Web API 应用程序都在 docker 容器中运行。

Web 应用程序的 docker compose 段是

    webfrontend:
        image: company/appname:latest
        ports:
            - 1980:80
            - 443:443 
        environment:
            - MongoDB_Connection_URL=mongodb://HIDDENURL
            - MongoDB_Database=MDBNAME
            - Matchmaking_SplitCharacterFreeTextSearch=,
            - Matchmaking_Engine_API_Username=USERNAME
            - Matchmaking_Engine_API_Password=PASSWORD
            - Matchmaking_Engine_API_BaseURL=https://ENDPOINTURL
        volumes:
            - .\keys:/root/.aspnet/DataProtection-Keys
        depends_on:
            - mongodb

标签: c#httpdotnet-httpclientwebapi

解决方案


推荐阅读