簡體   English   中英

將 asp.net web api 連接到 aws rds sql 服務器數據庫

[英]Connecting asp.net web api to aws rds sql server database

我正在嘗試將asp.net中制作的web api連接到aws rds提供的sql服務器數據庫。 我以前從未使用過 aws,所以我不確定我是否遺漏了什么。 我曾嘗試這樣做,但是當我添加遷移並嘗試更新數據庫(使用 EF 核心)時,我收到以下消息:

A. 與 SQL 服務器建立連接時發生網絡相關或特定於實例的錯誤。 服務器未找到或無法訪問。 驗證實例名稱是否正確以及 SQL 服務器是否配置為允許遠程連接。 (提供商:命名管道提供商,錯誤:40 - 無法打開與 SQL 服務器的連接)

我的 API 中有以下代碼:

上下文 class:

 public class TestContext : DbContext
    {
        public virtual DbSet<Fruit> Fruits { get; set; }

        public TestContext(DbContextOptions<TestContext> options) : base(options) { }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (!optionsBuilder.IsConfigured)
            {
                optionsBuilder.UseSqlServer("server=<nameofserver>;user=<username>;password=<password>;database=<nameofdatabase>;"); // there i put data from my database hosted on aws
            }
        }

在 Program.cs 中:

builder.Services.AddDbContext<TestContext>(options =>
                options.UseSqlServer("server=<nameofserver>;user=<username>;password=<password>;database=<nameofdatabase>;"))// there i put data from my database hosted on aws1;

我知道我應該將連接字符串放在 appsettings.json 中,但我相信現在情況並非如此。 為什么不在數據庫中創建表? 我應該在 aws 網站上啟用/做某事嗎? 或者問題出在代碼中? 我該如何解決?

目前,您會發現 .NET 的AWS SDK的類似用例。

當前示例向您展示如何使用AWS SDK for .NET (v3)創建一個 REST 服務,讓您可以執行以下操作:

  • 讀取、寫入和更新存儲在Amazon Aurora Serverless數據庫中的工作項。
  • 使用 Amazon Simple Email Service (Amazon SES) 發送工作項的 email 報告。
  • 創建一個包含數據庫憑證的 AWS Secrets Manager 密鑰,並使用它來驗證對數據庫的調用。 您可以在AWS 代碼庫中找到此示例 - 這是 go 以記錄最新的 AWS SDK 示例。

https://docs.aws.amazon.com/code-library/latest/ug/aurora_example_cross_RDSDataTracker_section.html

我相信這個例子會在某個時候移植到 SQL 服務器。

要連接到 SQL 服務器,您需要提供自己的連接詳細信息(與示例中討論的需要其他憑據的Amazon Aurora Serverless數據庫不同)。 另請注意,SQL 服務器沒有像 Amazon Aurora Serverless 那樣的服務客戶端。

另外 - 確保正確設置入站規則。

https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Overview.RDSSecurityGroups.html

設置入站規則、設置用戶密碼等后,以下 C# 應該可以使用。

static void Main(string[] args)
        {
            try 
            { 
                SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();

                builder.DataSource = "<your_server.database.windows.net>"; 
                builder.UserID = "<your_username>";            
                builder.Password = "<your_password>";     
                builder.InitialCatalog = "<your_database>";
         
                using (SqlConnection connection = new SqlConnection(builder.ConnectionString))
                {
                    Console.WriteLine("\nQuery data example:");
                    Console.WriteLine("=========================================\n");
                    
                    connection.Open();       

                    String sql = "SELECT name, collation_name FROM sys.databases";

                    using (SqlCommand command = new SqlCommand(sql, connection))
                    {
                        using (SqlDataReader reader = command.ExecuteReader())
                        {
                            while (reader.Read())
                            {
                                Console.WriteLine("{0} {1}", reader.GetString(0), reader.GetString(1));
                            }
                        }
                    }                    
                }
            }
            catch (SqlException e)
            {
                Console.WriteLine(e.ToString());
            }
            Console.WriteLine("\nDone. Press enter.");
            Console.ReadLine(); 
        }
    }

它可能與您的連接字符串有任何關系,也可能沒有任何關系,但您需要確保的第一件事是運行您的 api/網站的服務器有權與您的 rds 實例通信——默認情況下它沒有; 在執行任何其他操作之前,您將需要一個專門允許它的安全組(並且不要不小心將其公開 - 您的 rds 實例會被試圖猜測密碼的黑客攻擊)。

最簡單的檢查方法是啟動 SSMS 或其他此類工具,看看是否可以從運行代碼的機器連接到 RDS - 如果不能 - 你在代碼中做的任何事情都無法解決這個問題。

一旦您可以成功地從 SSMS 連接到 RDS,如果連接字符串仍然有問題,您可以嘗試使用它。

暫無
暫無

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

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