从Docker中的另一个微服务调用微服务不工作

nukf8bse  于 2023-02-11  发布在  Docker
关注(0)|答案(1)|浏览(187)

我有两个微服务在我的停靠应用程序。一个是Web API项目,第二个是Web MVC应用程序。我想调用Web 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

当我从浏览器调用它的工作很好。即使我使用相同的代码没有docker,然后调用Web API从mvc应用程序它的工作很好。我还启用了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上看到了这个问题的答案。
Call Microservice from another Microservice within Docker
但是我不明白我怎么能只使用API名称作为url,如这个答案中所解释的。当我在url中使用api名称时,如下所示:

https://catalogapi:44398/api/values

它会产生以下错误:

SocketException: No such host is known
System.Net.Http.ConnectHelper.ConnectAsync(string host, int port, 
CancellationToken cancellationToken)
jaxagkaj

jaxagkaj1#

Docker合成在您的主机上创建虚拟网络,并且具有这些IP的服务无法从Docker外部路由。
服务可以使用它们的名称http://running-service/相互通信。
我们可以使用Docker组合文件来初始化服务名称等细节,并使用它来调用其他微服务,例如http://running-service-1:port/

相关问题