c# - 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++ - C ++访问结构中结构数组的元素
- c++ - 创建一个新字符以传递给 C 中的方法
- spring-boot - Maven Spring Boot 无法推送 Docker 镜像
- r - 将不同长度的向量合并到动态矩阵中
- python - Python“SSL 传输上的致命错误”异步库问题
- elixir - localhost:4000 在运行发行版的二进制文件时拒绝连接。如何从混合版本开始的 elixir 应用程序访问错误日志?
- laravel-backpack - Laravel 背包获取路线丢失
- docker - 无法从容器内连接到 Docker 守护程序
- javascript - 您如何使用面部 ID 登录以使用 Firebase 做出本机反应?
- reactjs - Running react native iOS simulator on another local machine