Połączenie się z bazą MySQL znajdującą się na VPS z uzyciem EntityFrameworkCore Code First

0

Cześć.

Mam problem z połączeniem się z bazą MySQL znajdującą się na moim VPS. Zainstalowałem MySQL Entity Framework Stworzyłem Context jednak przy uruchomieniu dostaję błąd że host nie odpowiedział :

Unhandled exception. MySql.Data.MySqlClient.MySqlException (0x80004005): Reading from the stream has failed.
 ---> System.IO.IOException: Unable to read data from the transport connection: Próba połączenia nie powiodła się, ponieważ połączona strona nie odpowiedziała poprawnie po ustalonym okresie czasu lub utworzone połączenie nie powiodło się, ponieważ połączony host nie odpowiedział..
 ---> System.Net.Sockets.SocketException (10060): Próba połączenia nie powiodła się, ponieważ połączona strona nie odpowiedziała poprawnie po ustalonym okresie czasu lub utworzone połączenie nie powiodło się, ponieważ połączony host nie odpowiedział.

Tak wygląda mój Context gdzie oczywiście w miejscu 147.135.xxx.xxx jest IP mojego VPS

using Microsoft.EntityFrameworkCore;

public class AppContext : DbContext{

    DbSet<Product> Products {get;set;}
    DbSet<User> Users {get;set;}

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
      optionsBuilder.UseMySQL("SERVER=147.135.xxx.xxx;PORT=22;database=Company;UID=root;PASSWORD=password"); 
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
      base.OnModelCreating(modelBuilder);

      modelBuilder.Entity<User>(entity =>
      {
        entity.HasKey(e => e.Email);
        entity.Property(e => e.Email).IsRequired();
        entity.Property(e => e.Password).IsRequired();
      });

      modelBuilder.Entity<Product>(entity =>
      {
        entity.HasKey(e => e.Id);
        entity.Property(e => e.ProductName).IsRequired();
        entity.Property(e => e.Price).IsRequired();
      });
    }
}

Kiedy łączę się z bazą poprzez MySQL Workbench i SSH problemu nie ma więc problemu ze strony serwera raczej nie widzę.

Poniżej łączenie za pomocą SSH(zmienione IP :D )

screenshot-20201015215002.png

Czy problemem jest zły connection string w metodzie OnConfiguring ? Czy trzeba budować jakiś tunel poprzez łączenie przez SSH ? Tylko jak to zrobić używając Entity Framework.

Ps : Z paczek jakie mam zainstalowane to tylko MySql.Data.EntityFrameworkCore nic więcej.

0

Użyj Porto 3306. Jak nie jest zablokowany to powinno zadziałać

0

Po zamianie na port 3306 wyskakuje inny błąd :
Sprawdzałem na 2 komputerach i ten sam błąd.

Unhandled exception. System.InvalidOperationException: An exception has been raised that is likely due to a transient failure. Consider enabling transient error resiliency by adding 'EnableRetryOnFailure()' to the 'UseMySql' call.
 ---> MySql.Data.MySqlClient.MySqlException (0x80004005): Unable to connect to any of the specified MySQL hosts.
 ---> System.AggregateException: One or more errors occurred. (Nie można nawiązać połączenia, ponieważ komputer docelowy aktywnie go odmawia. 147.135.xxx.xxx:3306)
 ---> System.Net.Internals.SocketExceptionFactory+ExtendedSocketException (10061): Nie można nawiązać połączenia, ponieważ komputer docelowy aktywnie go odmawia. 147.135.xxx.xxx:3306
2

musisz wystawić na świat na VPSie port 3306 od MySQLa albo zestawić tunel SSH ręcznie przed połączeniem https://www.howtogeek.com/howto/ubuntu/access-your-mysql-server-remotely-over-ssh/

0

Ciekawe bo zamieniłem to samo na localhost :

  protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
      // optionsBuilder.UseMySQL("SERVER=localhost;PORT=3306;database=Company;UID=root;PASSWORD=password"); 
      optionsBuilder.UseMySQL("SERVER=localhost;PORT=3306;database=Company;UID=root;PASSWORD=;");
    }

I jest ze nie może :

(Nie można nawiązać połączenia, ponieważ komputer docelowy aktywnie go odmawia. 127.0.0.1:3306)
2
  1. Błędy są różne, bo w pierwszym przypadku próbujesz połączyć się z MySQL na porcie 22 na którym działa SSH, a w drugim na porty na których nie działa nic.
  2. Bazy danych domyślnie raczej nie pozwalają na połączenia zdalne, a Ty bijesz wprost na ten serwer. Dlatego działa Ci połączenie po SSH - najpierw łączysz się z VPS po SSH, a później już lokalnie do MySQL. https://dev.mysql.com/doc/connector-net/en/connector-net-ssh-tunneling.html Spróbował bym zmodyfikować connection string podobnie jak w artykule. Druga opcja to https://www.google.com/amp/s/www.digitalocean.com/community/tutorials/how-to-allow-remote-access-to-mysql.amp

1 użytkowników online, w tym zalogowanych: 0, gości: 1