簡體   English   中英

無法從 .NET Core WebAPI 容器連接到 MongoDB 容器,但可以正常連接

[英]Unable to connect to MongoDB container from .NET Core WebAPI container, but can connect normally

I'm trying to connect to a MongoDB container using a .NET core 3.1 webapi container but every time I build and run the webapi container I get the following exception thrown in one of the services when its attempting to get data using C# MongoDB.Driver from蒙戈容器:

'A timeout occured after 30000ms selecting a server using CompositeServerSelector{ Selectors = MongoDB.Driver.MongoClient+AreSessionsSupportedServerSelector, LatencyLimitingServerSelector{ AllowedLatencyRange = 00:00:00.0150000 } }. Client view of cluster state is { ClusterId : "1", ConnectionMode : "Automatic", Type : "Unknown", State : "Disconnected", Servers : [{ ServerId: "{ ClusterId : 1, EndPoint : "Unspecified/localhost:27017" }", EndPoint: "Unspecified/localhost:27017", State: "Disconnected", Type: "Unknown", HeartbeatException: "MongoDB.Driver.MongoConnectionException: An exception occurred while opening a connection to the server.
 ---> System.Net.Internals.SocketExceptionFactory+ExtendedSocketException (10061): No connection could be made because the target machine actively refused it. [::1]:27017
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw(Exception source)
   at System.Net.Sockets.Socket.EndConnect(IAsyncResult asyncResult)
   at System.Net.Sockets.Socket.<>c.<ConnectAsync>b__274_0(IAsyncResult iar)
--- End of stack trace from previous location where exception was thrown ---
   at MongoDB.Driver.Core.Connections.TcpStreamFactory.ConnectAsync(Socket socket, EndPoint endPoint, CancellationToken cancellationToken)
   at MongoDB.Driver.Core.Connections.TcpStreamFactory.CreateStreamAsync(EndPoint endPoint, CancellationToken cancellationToken)
   at MongoDB.Driver.Core.Connections.BinaryConnection.OpenHelperAsync(CancellationToken cancellationToken)
   --- End of inner exception stack trace ---
   at MongoDB.Driver.Core.Connections.BinaryConnection.OpenHelperAsync(CancellationToken cancellationToken)
   at MongoDB.Driver.Core.Servers.ServerMonitor.HeartbeatAsync(CancellationToken cancellationToken)", LastUpdateTimestamp: "2020-06-07T05:10:17.3502634Z" }] }.'

I can successfully connect to the MongoDB container using MongoDB compass or even using the same web api IIS express instace, the above exception is only thrown when I try to connect using a docker container. 我檢查了兩個容器並確認它們都在同一個網絡上運行。

這里是 webapi 的 Dockerfile:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-nanoserver-1903 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-nanoserver-1903 AS build
WORKDIR /src
COPY ["API/API.csproj", "API/"]
RUN dotnet restore "API/API.csproj"
COPY . .
WORKDIR "/src/API"
RUN dotnet build "API.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "API.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "API.dll"]

MongoDB 容器使用的是最新的官方 MongoDb 鏡像。 使用以下命令運行 docker 映像:

docker run -d -p 27017-27019:27017-27019 --name mongodb mongo:latest

webapi appsettings.json 看起來像這樣:

{
  "DatabaseSettings": {
    "CollectionName": "collectionName",
    "ConnectionString": "mongodb://host.docker.internal:27017",
    "DatabaseName": "db"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
}

.NET core 3.1 webapi是按照微軟教程構建的

有關更多信息,這里是 Startup.cs 文件的樣子:

public void ConfigureServices(IServiceCollection services)
{
    // requires using Microsoft.Extensions.Options
    services.Configure<DatabaseSettings>(
        Configuration.GetSection(nameof(DatabaseSettings)));

    services.AddSingleton<IDatabaseSettings>(sp =>
        sp.GetRequiredService<IOptions<DatabaseSettings>>().Value);

    services.AddSingleton<EarningsService>();

    services.AddCors(o => o.AddPolicy("CorsPolicy", builder =>
    {
        builder.AllowAnyOrigin()
            .AllowAnyMethod()
            .AllowAnyHeader();
    }));

    services.AddControllers();
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    //app.UseHttpsRedirection();

    app.UseRouting();

    app.UseAuthorization();

    app.UseCors("CorsPolicy");

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

我查看了以下所有問題,試圖弄清楚如何連接:

任何幫助是極大的贊賞。 謝謝!

首先,容器必須在同一個網絡上,您需要指定 mongodb 容器的連接字符串,如下所示

WINDOWS: “ConnectionString”:“mongodb://:@host.docker.internal:27017/db-name?directConnection=true”。

MAC 操作系統: “ConnectionString”:“mongodb://:@docker.for.mac.localhost:27017/db-name?directConnection=true”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM