В моем докеризованном приложении есть два микросервиса. Одним из них является Web Api Project, а вторым - приложение Web MVC. Я хочу вызвать веб-API в приложении MVC.
Примечание: я использую .Net Core 2.1
Я звоню таким образом:
using (var client = new HttpClient())
{
try
{
var res = await
client.GetStringAsync("http://localhost:44398/api/values");
return Ok(res);
}
catch (Exception ex)
{
throw ex;
}
}
Но выдает эту ошибку:
An unhandled exception occurred while processing the request.
SocketException: No connection could be made because the target machine
actively refused it
System.Net.Http.ConnectHelper.ConnectAsync(string host, int port,
CancellationToken cancellationToken)
HttpRequestException: No connection could be made because the target
machine actively refused it
WebMVCApp.Controllers.HomeController.Index() in HomeController.cs, line 27
Когда я звоню из браузера, все работает нормально. Даже если я использую тот же код без докера, а затем вызываю веб-API из mvc app, он работает нормально.
Я также включил CORS:
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddPolicy("CorsPolicy",
builder => builder
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader());
});
services.AddMvc();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseHsts();
}
app.UseCors("CorsPolicy");
app.UseHttpsRedirection();
app.UseMvc();
}
Пожалуйста, помогите мне решить эту проблему. Я потратил много времени, чтобы исправить это, но я не могу понять, в чем проблема.
Я также прочитал ответ на этот вопрос на stackoverflow.
Вызовите микросервис из другого микросервиса в Docker
Но я не могу понять, как я могу использовать только имя API в качестве URL, как объяснено в этом ответе. когда я использую имя API в URL, как это:
https://catalogapi:44398/api/values
Выдает эту ошибку:
SocketException: No such host is known
System.Net.Http.ConnectHelper.ConnectAsync(string host, int port,
CancellationToken cancellationToken)