Trong bài viết này, chúng ta sẽ xây dựng một biểu mẫu quản lý tác vụ MVC với. NET lõi 2. 2. Chúng tôi cũng sẽ trình bày cách tích hợp với cơ sở dữ liệu MySQL từ MVC và cách sử dụng Twilio để gửi tin nhắn SMS đến ứng dụng của bạn sẽ thêm tác vụ mới vào danh sách của bạn
NET Core và MySQL đều là công nghệ mã nguồn mở và miễn phí. ASP mới. NET Core có thể chạy trên Linux và trong Bộ chứa Linux và MySQL là một trong những cơ sở dữ liệu dễ dàng nhất để bắt đầu sử dụng. Điều này làm cho sự kết hợp của ASP. NET Core và MySQL một sự kết hợp khá hấp dẫn. Hãy xem những gì bạn cần để bắt đầu
điều kiện tiên quyết
- Tài khoản nhà phát triển Okta miễn phí
- MySQL đã cài đặt và sẽ cần biết thông tin đăng nhập máy chủ và quyền truy cập của bạn trong giây lát
- Tài khoản Twilio
Giàn giáo ASP của bạn. Ứng dụng NET Core MVC
Hãy bắt đầu với một số giàn giáo và phụ thuộc cơ bản. Để bắt đầu, hãy mở Visual Studio và tạo một ASP mới. NET Core Web Application có tên là USE TextTasks; CREATE TABLE IF NOT EXISTS Tasks ( TaskId INT AUTO_INCREMENT, Text TEXT NOT NULL, Created DATE NOT NULL, Completed DATE, Archived DATE, PRIMARY KEY(TaskId) ); INSERT INTO Tasks(Text,Created) VALUES ('Initial test task 1', STR_TO_DATE('2019/07/04', '%Y/%m/%d')); INSERT INTO Tasks(Text,Created) VALUES ('Initial test task 2', STR_TO_DATE('2019/07/04', '%Y/%m/%d')); INSERT INTO Tasks(Text,Created) VALUES ('Initial test task 3', STR_TO_DATE('2019/07/04', '%Y/%m/%d')); 7 và chọn mẫu Ứng dụng web (Model-View-Controller), được định cấu hình cho ASP. NET lõi 2. 2. Nhấp vào biểu tượng Bắt đầu gỡ lỗi hoặc nhấn F5 để khởi động ứng dụng và theo dõi URL để sử dụng trong giây lát
Cài đặt MySQL. Gói Nuget dữ liệu
Cài đặt MySql. Gói dữ liệu Nuget do Oracle xuất bản. Bài viết này sử dụng phiên bản 8. 0. 17 - phiên bản mới nhất tại thời điểm xuất bản
Cài đặt Okta để quản lý người dùng trong ASP của bạn. ứng dụng NET
Cài đặt Ota. Gói Sdk NuGet được xuất bản bởi Okta, Inc. Bài viết này sử dụng phiên bản 1. 2. 2 - phiên bản mới nhất tại thời điểm xuất bản
Cũng cài đặt Okta. Gói AspNetCore NuGet được xuất bản bởi Okta, Inc. Bài viết này sử dụng phiên bản 1. 2. 0 - phiên bản mới nhất tại thời điểm xuất bản
Chúng tôi sẽ sử dụng quản lý Đăng nhập một lần (SSO) của Okta cho ứng dụng MVC của bạn. Điều này sẽ cho phép bạn hạn chế quyền truy cập vào ứng dụng của mình chỉ đối với những người dùng mà bạn cấp quyền truy cập
Nếu bạn chưa có, hãy tạo tài khoản nhà phát triển Okta miễn phí. Okta là một dịch vụ dành cho nhà phát triển lưu trữ an toàn tài khoản người dùng và giúp đơn giản hóa việc thêm chức năng quản lý người dùng thông thường. Khi bạn có tài khoản Okta, hãy đăng nhập vào bảng điều khiển của bạn
Đăng nhập và chọn Ứng dụng từ menu chính, sau đó chọn Thêm ứng dụng
Chọn Web làm loại ứng dụng của bạn
Tiếp theo, bạn sẽ cần URL mà bạn đã lưu trước đó vào ứng dụng MVC đang chạy cục bộ của mình. Định cấu hình các cài đặt sau cho ứng dụng mới của bạn thay thế “{yourLocalUrl}” bằng URL cục bộ thực tế của bạn (e. g. USE TextTasks; CREATE TABLE IF NOT EXISTS Tasks ( TaskId INT AUTO_INCREMENT, Text TEXT NOT NULL, Created DATE NOT NULL, Completed DATE, Archived DATE, PRIMARY KEY(TaskId) ); INSERT INTO Tasks(Text,Created) VALUES ('Initial test task 1', STR_TO_DATE('2019/07/04', '%Y/%m/%d')); INSERT INTO Tasks(Text,Created) VALUES ('Initial test task 2', STR_TO_DATE('2019/07/04', '%Y/%m/%d')); INSERT INTO Tasks(Text,Created) VALUES ('Initial test task 3', STR_TO_DATE('2019/07/04', '%Y/%m/%d')); 8)
- URI cơ sở. USE TextTasks; CREATE TABLE IF NOT EXISTS Tasks ( TaskId INT AUTO_INCREMENT, Text TEXT NOT NULL, Created DATE NOT NULL, Completed DATE, Archived DATE, PRIMARY KEY(TaskId) ); INSERT INTO Tasks(Text,Created) VALUES ('Initial test task 1', STR_TO_DATE('2019/07/04', '%Y/%m/%d')); INSERT INTO Tasks(Text,Created) VALUES ('Initial test task 2', STR_TO_DATE('2019/07/04', '%Y/%m/%d')); INSERT INTO Tasks(Text,Created) VALUES ('Initial test task 3', STR_TO_DATE('2019/07/04', '%Y/%m/%d')); 9
- URI chuyển hướng đăng nhập. using System; using MySql.Data.MySqlClient; namespace TextTasks { public class MySqlDatabase : IDisposable { public MySqlConnection Connection; public MySqlDatabase(string connectionString) { Connection = new MySqlConnection(connectionString); this.Connection.Open(); } public void Dispose() { Connection.Close(); } } } 0
- Bắt đầu URI đăng nhập. using System; using MySql.Data.MySqlClient; namespace TextTasks { public class MySqlDatabase : IDisposable { public MySqlConnection Connection; public MySqlDatabase(string connectionString) { Connection = new MySqlConnection(connectionString); this.Connection.Open(); } public void Dispose() { Connection.Close(); } } } 0
- Cho phép các loại trợ cấp
- Mã ủy quyền
- Tiềm ẩn (Kết hợp)
Sau khi bạn lưu cài đặt của mình, hãy nhấp vào Chỉnh sửa bằng Cài đặt chung, sau đó chọn hai hộp kiểm sau như minh họa trong ảnh chụp màn hình bên dưới
Sau khi ứng dụng mới của bạn được tạo, hãy cuộn xuống dưới cùng và sao chép ID khách hàng và Bí mật khách hàng của bạn. Bạn sẽ cần những thứ đó sau này khi mã hóa Okta vào ứng dụng MVC của bạn
Thiết lập cơ sở dữ liệu MySQL của bạn
Trước khi chúng tôi viết ứng dụng để truy cập cơ sở dữ liệu của mình, chúng tôi cần chuẩn bị và chạy cơ sở dữ liệu của mình. Để làm như vậy, chúng tôi sẽ kết nối với máy chủ MySQL của chúng tôi và chạy một số tập lệnh. Bài viết này sử dụng MySQL Workbench để kết nối với máy chủ cơ sở dữ liệu của chúng tôi, nhưng bất kỳ IDE MySQL nào cũng sẽ làm được
Mở MySQL Workbench và truy cập using System; using MySql.Data.MySqlClient; namespace TextTasks { public class MySqlDatabase : IDisposable { public MySqlConnection Connection; public MySqlDatabase(string connectionString) { Connection = new MySqlConnection(connectionString); this.Connection.Open(); } public void Dispose() { Connection.Close(); } } } 2. Nhập tên máy chủ cho máy chủ cơ sở dữ liệu của bạn và thông tin đăng nhập cơ sở dữ liệu của bạn. Sau khi kết nối, hãy thực thi tập lệnh sau để tạo cơ sở dữ liệu USE TextTasks; CREATE TABLE IF NOT EXISTS Tasks ( TaskId INT AUTO_INCREMENT, Text TEXT NOT NULL, Created DATE NOT NULL, Completed DATE, Archived DATE, PRIMARY KEY(TaskId) ); INSERT INTO Tasks(Text,Created) VALUES ('Initial test task 1', STR_TO_DATE('2019/07/04', '%Y/%m/%d')); INSERT INTO Tasks(Text,Created) VALUES ('Initial test task 2', STR_TO_DATE('2019/07/04', '%Y/%m/%d')); INSERT INTO Tasks(Text,Created) VALUES ('Initial test task 3', STR_TO_DATE('2019/07/04', '%Y/%m/%d')); 7 mới của bạn
CREATE DATABASE IF NOT EXISTS TextTasks;
Tiếp theo, bạn sẽ cần thiết lập các bảng để lưu trữ các tác vụ của mình. Trong cửa sổ truy vấn, hãy thực thi tập lệnh sau để tạo bảng using System; using MySql.Data.MySqlClient; namespace TextTasks { public class MySqlDatabase : IDisposable { public MySqlConnection Connection; public MySqlDatabase(string connectionString) { Connection = new MySqlConnection(connectionString); this.Connection.Open(); } public void Dispose() { Connection.Close(); } } } 4 chứa tất cả các tác vụ trong danh sách tác vụ của chúng ta và tạo ba tác vụ để kiểm tra
USE TextTasks; CREATE TABLE IF NOT EXISTS Tasks ( TaskId INT AUTO_INCREMENT, Text TEXT NOT NULL, Created DATE NOT NULL, Completed DATE, Archived DATE, PRIMARY KEY(TaskId) ); INSERT INTO Tasks(Text,Created) VALUES ('Initial test task 1', STR_TO_DATE('2019/07/04', '%Y/%m/%d')); INSERT INTO Tasks(Text,Created) VALUES ('Initial test task 2', STR_TO_DATE('2019/07/04', '%Y/%m/%d')); INSERT INTO Tasks(Text,Created) VALUES ('Initial test task 3', STR_TO_DATE('2019/07/04', '%Y/%m/%d'));
Thêm mã để kết nối với MySQL từ ASP. NET
Bây giờ hãy chuyển sang mã. Nhấp chuột phải vào dự án và thêm một lớp mới có tên using System; using MySql.Data.MySqlClient; namespace TextTasks { public class MySqlDatabase : IDisposable { public MySqlConnection Connection; public MySqlDatabase(string connectionString) { Connection = new MySqlConnection(connectionString); this.Connection.Open(); } public void Dispose() { Connection.Close(); } } } 5. Lớp này là một trình bao bọc cho phần phụ thuộc using System; using MySql.Data.MySqlClient; namespace TextTasks { public class MySqlDatabase : IDisposable { public MySqlConnection Connection; public MySqlDatabase(string connectionString) { Connection = new MySqlConnection(connectionString); this.Connection.Open(); } public void Dispose() { Connection.Close(); } } } 6 mà chúng ta sẽ làm việc để truy vấn cơ sở dữ liệu MySQL
using System; using MySql.Data.MySqlClient; namespace TextTasks { public class MySqlDatabase : IDisposable { public MySqlConnection Connection; public MySqlDatabase(string connectionString) { Connection = new MySqlConnection(connectionString); this.Connection.Open(); } public void Dispose() { Connection.Close(); } } }
Tiếp theo, thêm các dòng mã sau vào cuối phương thức using System; using MySql.Data.MySqlClient; namespace TextTasks { public class MySqlDatabase : IDisposable { public MySqlConnection Connection; public MySqlDatabase(string connectionString) { Connection = new MySqlConnection(connectionString); this.Connection.Open(); } public void Dispose() { Connection.Close(); } } } 7 của tệp using System; using MySql.Data.MySqlClient; namespace TextTasks { public class MySqlDatabase : IDisposable { public MySqlConnection Connection; public MySqlDatabase(string connectionString) { Connection = new MySqlConnection(connectionString); this.Connection.Open(); } public void Dispose() { Connection.Close(); } } } 8. Thay thế máy chủ, tên người dùng và mật khẩu bằng phiên bản MySQL của riêng bạn
//MySql services.AddTransient<MySqlDatabase>(_ => new MySqlDatabase("server=YOUR-MYSQL-ENDPOINT; database=texttasks; uid=YOUR-USER-NAME; pwd=YOUR-PASSWORD;"));
Phần phụ thuộc cơ sở dữ liệu của bạn hiện đã được triển khai để một thể hiện của lớp using System; using MySql.Data.MySqlClient; namespace TextTasks { public class MySqlDatabase : IDisposable { public MySqlConnection Connection; public MySqlDatabase(string connectionString) { Connection = new MySqlConnection(connectionString); this.Connection.Open(); } public void Dispose() { Connection.Close(); } } } 5 sẽ được tạo, sử dụng mã ở trên, bất cứ khi nào hàm tạo của bộ điều khiển chấp nhận loại using System; using MySql.Data.MySqlClient; namespace TextTasks { public class MySqlDatabase : IDisposable { public MySqlConnection Connection; public MySqlDatabase(string connectionString) { Connection = new MySqlConnection(connectionString); this.Connection.Open(); } public void Dispose() { Connection.Close(); } } } 5 làm tham số
Xây dựng ASP. NET Core Models
Chúng tôi sẽ sử dụng hai loại sau để truyền dữ liệu về các thực thể của chúng tôi giữa các lớp của ứng dụng mới của bạn. Thêm một lớp mới vào thư mục //MySql services.AddTransient<MySqlDatabase>(_ => new MySqlDatabase("server=YOUR-MYSQL-ENDPOINT; database=texttasks; uid=YOUR-USER-NAME; pwd=YOUR-PASSWORD;")); 1 có tên là //MySql services.AddTransient<MySqlDatabase>(_ => new MySqlDatabase("server=YOUR-MYSQL-ENDPOINT; database=texttasks; uid=YOUR-USER-NAME; pwd=YOUR-PASSWORD;")); 2. Dán đoạn mã sau vào lớp mới của bạn
using System; namespace TextTasks.Models { public class Task { public int TaskId { get; set; } public string Text { get; set; } public DateTime? Completed { get; set; } } }
Tạo một lớp mới khác trong thư mục //MySql services.AddTransient<MySqlDatabase>(_ => new MySqlDatabase("server=YOUR-MYSQL-ENDPOINT; database=texttasks; uid=YOUR-USER-NAME; pwd=YOUR-PASSWORD;")); 1 có tên //MySql services.AddTransient<MySqlDatabase>(_ => new MySqlDatabase("server=YOUR-MYSQL-ENDPOINT; database=texttasks; uid=YOUR-USER-NAME; pwd=YOUR-PASSWORD;")); 4 và dán đoạn mã sau vào lớp mới của bạn
using System; namespace TextTasks.Models { public class TaskIdentifier { public int TaskId { get; set; } } }
Thêm Bộ điều khiển vào ASP của bạn. ứng dụng NET Core
//MySql services.AddTransient<MySqlDatabase>(_ => new MySqlDatabase("server=YOUR-MYSQL-ENDPOINT; database=texttasks; uid=YOUR-USER-NAME; pwd=YOUR-PASSWORD;")); 5 sẽ xử lý việc tạo các bản ghi mới, cũng như cập nhật các bản ghi hiện có để đánh dấu chúng là hoàn chỉnh, chưa hoàn chỉnh hoặc đã lưu trữ
Thêm một lớp mới tên là //MySql services.AddTransient<MySqlDatabase>(_ => new MySqlDatabase("server=YOUR-MYSQL-ENDPOINT; database=texttasks; uid=YOUR-USER-NAME; pwd=YOUR-PASSWORD;")); 5 vào thư mục //MySql services.AddTransient<MySqlDatabase>(_ => new MySqlDatabase("server=YOUR-MYSQL-ENDPOINT; database=texttasks; uid=YOUR-USER-NAME; pwd=YOUR-PASSWORD;")); 7. Dán mã dưới đây vào lớp mới của bạn. Như bạn có thể thấy, tham số đầu tiên của hàm tạo là loại using System; using MySql.Data.MySqlClient; namespace TextTasks { public class MySqlDatabase : IDisposable { public MySqlConnection Connection; public MySqlDatabase(string connectionString) { Connection = new MySqlConnection(connectionString); this.Connection.Open(); } public void Dispose() { Connection.Close(); } } } 5. Đây là mã sẽ nhận thể hiện của loại using System; using MySql.Data.MySqlClient; namespace TextTasks { public class MySqlDatabase : IDisposable { public MySqlConnection Connection; public MySqlDatabase(string connectionString) { Connection = new MySqlConnection(connectionString); this.Connection.Open(); } public void Dispose() { Connection.Close(); } } } 5 mà chúng tôi đã tạo trong phương thức using System; using MySql.Data.MySqlClient; namespace TextTasks { public class MySqlDatabase : IDisposable { public MySqlConnection Connection; public MySqlDatabase(string connectionString) { Connection = new MySqlConnection(connectionString); this.Connection.Open(); } public void Dispose() { Connection.Close(); } } } 7 của using System; using MySql.Data.MySqlClient; namespace TextTasks { public class MySqlDatabase : IDisposable { public MySqlConnection Connection; public MySqlDatabase(string connectionString) { Connection = new MySqlConnection(connectionString); this.Connection.Open(); } public void Dispose() { Connection.Close(); } } } 8
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using MySql.Data.MySqlClient; using dto = TextTasks.Models; namespace TextTasks.Controllers { public class TasksController : Controller { private MySqlDatabase MySqlDatabase { get; set; } public TasksController(MySqlDatabase mySqlDatabase) { this.MySqlDatabase = mySqlDatabase; } [HttpPost] public void Complete(dto.TaskIdentifier input) { var cmd = this.MySqlDatabase.Connection.CreateCommand() as MySqlCommand; cmd.CommandText = @"UPDATE Tasks SET Completed = STR_TO_DATE(@Date, '%Y/%m/%d') WHERE TaskId = @TaskId;"; cmd.Parameters.AddWithValue("@TaskId", input.TaskId); cmd.Parameters.AddWithValue("@Date", DateTime.Now.ToString("yyyy/MM/dd")); var recs = cmd.ExecuteNonQuery(); } [HttpPost] public void Incomplete(dto.TaskIdentifier input) { var cmd = this.MySqlDatabase.Connection.CreateCommand() as MySqlCommand; cmd.CommandText = @"UPDATE Tasks SET Completed = NULL WHERE TaskId = @TaskId;"; cmd.Parameters.AddWithValue("@TaskId", input.TaskId); var recs = cmd.ExecuteNonQuery(); } [HttpPost] public void Archive(dto.TaskIdentifier input) { var cmd = this.MySqlDatabase.Connection.CreateCommand() as MySqlCommand; cmd.CommandText = @"UPDATE Tasks SET Archived = STR_TO_DATE(@Date, '%Y/%m/%d') WHERE TaskId = @TaskId;"; cmd.Parameters.AddWithValue("@TaskId", input.TaskId); cmd.Parameters.AddWithValue("@Date", DateTime.Now.ToString("yyyy/MM/dd")); var recs = cmd.ExecuteNonQuery(); } [HttpPost] public string Sms() { var input = Request.Form["Body"]; string response = null; var cmd = this.MySqlDatabase.Connection.CreateCommand() as MySqlCommand; cmd.CommandText = @"INSERT INTO Tasks(Text,Created) VALUES (@Text,STR_TO_DATE(@Date, '%Y/%m/%d'));"; cmd.Parameters.AddWithValue("@Text", input); cmd.Parameters.AddWithValue("@Date", DateTime.Now.ToString("yyyy/MM/dd")); var recs = cmd.ExecuteNonQuery(); if (recs == 1) response = "OK"; else response = "Sorry! I didn't get that."; return response; } } }
Xây dựng Bộ điều khiển Trang chủ và Trang
Tiếp theo, sửa đổi using System; namespace TextTasks.Models { public class Task { public int TaskId { get; set; } public string Text { get; set; } public DateTime? Completed { get; set; } } } 2 để chuyển một using System; namespace TextTasks.Models { public class Task { public int TaskId { get; set; } public string Text { get; set; } public DateTime? Completed { get; set; } } } 3 cho chế độ xem. Để bắt đầu, hãy thêm các câu lệnh sử dụng sau
using MySql.Data.MySqlClient; using dto = TextTasks.Models;
Sau đó, thêm hàm tạo sau khai báo using System; using MySql.Data.MySqlClient; namespace TextTasks { public class MySqlDatabase : IDisposable { public MySqlConnection Connection; public MySqlDatabase(string connectionString) { Connection = new MySqlConnection(connectionString); this.Connection.Open(); } public void Dispose() { Connection.Close(); } } } 5 làm phần phụ thuộc và lưu trữ nó để sử dụng trong tương lai
private MySqlDatabase MySqlDatabase { get; set; } public HomeController(MySqlDatabase mySqlDatabase) { this.MySqlDatabase = mySqlDatabase; }
Thêm phương thức riêng tư sau để hỗ trợ tải danh sách tác vụ từ cơ sở dữ liệu
private async Task<List<dto.Task>> GetTasks() { var ret = new List<dto.Task>(); var cmd = this.MySqlDatabase.Connection.CreateCommand() as MySqlCommand; cmd.CommandText = @"SELECT TaskId, Text, Completed FROM Tasks WHERE Archived IS NULL"; using (var reader = await cmd.ExecuteReaderAsync()) while (await reader.ReadAsync()) { var t = new dto.Task() { TaskId = reader.GetFieldValue<int>(0), Text = reader.GetFieldValue<string>(1) }; if (!reader.IsDBNull(2)) t.Completed = reader.GetFieldValue<DateTime>(2); ret.Add(t); } return ret; }
Sửa đổi phương thức using System; namespace TextTasks.Models { public class Task { public int TaskId { get; set; } public string Text { get; set; } public DateTime? Completed { get; set; } } } 5 để truyền dữ liệu cho dạng xem
USE TextTasks; CREATE TABLE IF NOT EXISTS Tasks ( TaskId INT AUTO_INCREMENT, Text TEXT NOT NULL, Created DATE NOT NULL, Completed DATE, Archived DATE, PRIMARY KEY(TaskId) ); INSERT INTO Tasks(Text,Created) VALUES ('Initial test task 1', STR_TO_DATE('2019/07/04', '%Y/%m/%d')); INSERT INTO Tasks(Text,Created) VALUES ('Initial test task 2', STR_TO_DATE('2019/07/04', '%Y/%m/%d')); INSERT INTO Tasks(Text,Created) VALUES ('Initial test task 3', STR_TO_DATE('2019/07/04', '%Y/%m/%d')); 0
Cuối cùng, sửa đổi chế độ xem để hiển thị dữ liệu trong biểu mẫu của chúng tôi. Mở using System; namespace TextTasks.Models { public class Task { public int TaskId { get; set; } public string Text { get; set; } public DateTime? Completed { get; set; } } } 6 và dán đoạn mã sau vào tệp
USE TextTasks; CREATE TABLE IF NOT EXISTS Tasks ( TaskId INT AUTO_INCREMENT, Text TEXT NOT NULL, Created DATE NOT NULL, Completed DATE, Archived DATE, PRIMARY KEY(TaskId) ); INSERT INTO Tasks(Text,Created) VALUES ('Initial test task 1', STR_TO_DATE('2019/07/04', '%Y/%m/%d')); INSERT INTO Tasks(Text,Created) VALUES ('Initial test task 2', STR_TO_DATE('2019/07/04', '%Y/%m/%d')); INSERT INTO Tasks(Text,Created) VALUES ('Initial test task 3', STR_TO_DATE('2019/07/04', '%Y/%m/%d')); 1
Thêm chức năng SMS vào ASP của bạn. NET với Twilio
Khi bạn tạo tài khoản Twilio, tài khoản này sẽ hướng dẫn bạn quy trình thiết lập số điện thoại đầu tiên của mình. Nếu khi được nhắc bạn đã chọn rằng bạn muốn gửi và nhận tin nhắn SMS bằng số điện thoại của mình, thì bạn có thể sử dụng số này trong bài viết này. Nếu không, bạn sẽ cần thêm một số điện thoại mới
Khi số điện thoại mới của bạn được thiết lập, hãy chuyển đến menu Tất cả dịch vụ và chọn Số điện thoại. Bấm vào số điện thoại bạn vừa tạo trong danh sách
Bây giờ chúng tôi đang xem chi tiết cho số điện thoại mới này, chúng tôi muốn sửa đổi cài đặt webhook khi có tin nhắn đến. Thay đổi hành động thành using System; namespace TextTasks.Models { public class Task { public int TaskId { get; set; } public string Text { get; set; } public DateTime? Completed { get; set; } } } 7 và sau đó chúng tôi sẽ đặt URL webhook thành hành động using System; namespace TextTasks.Models { public class Task { public int TaskId { get; set; } public string Text { get; set; } public DateTime? Completed { get; set; } } } 8 của bộ điều khiển using System; using MySql.Data.MySqlClient; namespace TextTasks { public class MySqlDatabase : IDisposable { public MySqlConnection Connection; public MySqlDatabase(string connectionString) { Connection = new MySqlConnection(connectionString); this.Connection.Open(); } public void Dispose() { Connection.Close(); } } } 4. Bạn sẽ muốn sử dụng URL công khai cho ứng dụng MVC của mình để Twilio có thể truy cập nó (thay thế “{yourPublicUrl}” bằng URL công khai thực tế của bạn)
Webhook khi có tin nhắn đến. using System; namespace TextTasks.Models { public class TaskIdentifier { public int TaskId { get; set; } } } 0
Kiểm tra ASP. NET cục bộ với Postman
Nếu bạn muốn thử nghiệm nhanh giải pháp của mình cục bộ (không cần gọi webhook qua Twilio), bạn có thể thực hiện qua Postman
Chuẩn bị yêu cầu Người đưa thư sau (thay thế “{yourLocalUrl}” bằng URL thực của bạn)
[POST] using System; namespace TextTasks.Models { public class TaskIdentifier { public int TaskId { get; set; } } } 1
Thêm các thông số sau. using System; namespace TextTasks.Models { public class TaskIdentifier { public int TaskId { get; set; } } } 2 = using System; namespace TextTasks.Models { public class TaskIdentifier { public int TaskId { get; set; } } } 3
Nhấp vào Gửi để kiểm tra dịch vụ của bạn. "Chào thế giới. ” đại diện cho bản sao được nhắn tin vào hệ thống. Dịch vụ sẽ phản hồi bằng “OK” hoặc “Xin lỗi. tôi không hiểu. ” Phản hồi đó là thông điệp mà người gửi văn bản “Xin chào thế giới” ban đầu sẽ nhận lại
Thêm xác thực vào ASP của bạn. Ứng dụng NET Core MVC
Ứng dụng của bạn tại thời điểm này có đầy đủ chức năng trừ mã xác thực Okta. Để bắt đầu, hãy thêm các câu lệnh sử dụng sau vào đầu lớp using System; namespace TextTasks.Models { public class TaskIdentifier { public int TaskId { get; set; } } } 4 của bạn
USE TextTasks; CREATE TABLE IF NOT EXISTS Tasks ( TaskId INT AUTO_INCREMENT, Text TEXT NOT NULL, Created DATE NOT NULL, Completed DATE, Archived DATE, PRIMARY KEY(TaskId) ); INSERT INTO Tasks(Text,Created) VALUES ('Initial test task 1', STR_TO_DATE('2019/07/04', '%Y/%m/%d')); INSERT INTO Tasks(Text,Created) VALUES ('Initial test task 2', STR_TO_DATE('2019/07/04', '%Y/%m/%d')); INSERT INTO Tasks(Text,Created) VALUES ('Initial test task 3', STR_TO_DATE('2019/07/04', '%Y/%m/%d')); 2
Tiếp theo, thêm phần sau vào đầu phương thức using System; using MySql.Data.MySqlClient; namespace TextTasks { public class MySqlDatabase : IDisposable { public MySqlConnection Connection; public MySqlDatabase(string connectionString) { Connection = new MySqlConnection(connectionString); this.Connection.Open(); } public void Dispose() { Connection.Close(); } } } 7 của lớp using System; namespace TextTasks.Models { public class TaskIdentifier { public int TaskId { get; set; } } } 4 của bạn
USE TextTasks; CREATE TABLE IF NOT EXISTS Tasks ( TaskId INT AUTO_INCREMENT, Text TEXT NOT NULL, Created DATE NOT NULL, Completed DATE, Archived DATE, PRIMARY KEY(TaskId) ); INSERT INTO Tasks(Text,Created) VALUES ('Initial test task 1', STR_TO_DATE('2019/07/04', '%Y/%m/%d')); INSERT INTO Tasks(Text,Created) VALUES ('Initial test task 2', STR_TO_DATE('2019/07/04', '%Y/%m/%d')); INSERT INTO Tasks(Text,Created) VALUES ('Initial test task 3', STR_TO_DATE('2019/07/04', '%Y/%m/%d')); 3
Sau đó, thêm phần sau vào đầu phương thức using System; namespace TextTasks.Models { public class TaskIdentifier { public int TaskId { get; set; } } } 7 của lớp using System; namespace TextTasks.Models { public class TaskIdentifier { public int TaskId { get; set; } } } 4 của bạn
USE TextTasks; CREATE TABLE IF NOT EXISTS Tasks ( TaskId INT AUTO_INCREMENT, Text TEXT NOT NULL, Created DATE NOT NULL, Completed DATE, Archived DATE, PRIMARY KEY(TaskId) ); INSERT INTO Tasks(Text,Created) VALUES ('Initial test task 1', STR_TO_DATE('2019/07/04', '%Y/%m/%d')); INSERT INTO Tasks(Text,Created) VALUES ('Initial test task 2', STR_TO_DATE('2019/07/04', '%Y/%m/%d')); INSERT INTO Tasks(Text,Created) VALUES ('Initial test task 3', STR_TO_DATE('2019/07/04', '%Y/%m/%d')); 4
Thêm các câu lệnh sử dụng sau vào using System; namespace TextTasks.Models { public class Task { public int TaskId { get; set; } public string Text { get; set; } public DateTime? Completed { get; set; } } } 2 và //MySql services.AddTransient<MySqlDatabase>(_ => new MySqlDatabase("server=YOUR-MYSQL-ENDPOINT; database=texttasks; uid=YOUR-USER-NAME; pwd=YOUR-PASSWORD;")); 5. Điều này giúp chúng ta có thể sử dụng rút gọn thuộc tính using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using MySql.Data.MySqlClient; using dto = TextTasks.Models; namespace TextTasks.Controllers { public class TasksController : Controller { private MySqlDatabase MySqlDatabase { get; set; } public TasksController(MySqlDatabase mySqlDatabase) { this.MySqlDatabase = mySqlDatabase; } [HttpPost] public void Complete(dto.TaskIdentifier input) { var cmd = this.MySqlDatabase.Connection.CreateCommand() as MySqlCommand; cmd.CommandText = @"UPDATE Tasks SET Completed = STR_TO_DATE(@Date, '%Y/%m/%d') WHERE TaskId = @TaskId;"; cmd.Parameters.AddWithValue("@TaskId", input.TaskId); cmd.Parameters.AddWithValue("@Date", DateTime.Now.ToString("yyyy/MM/dd")); var recs = cmd.ExecuteNonQuery(); } [HttpPost] public void Incomplete(dto.TaskIdentifier input) { var cmd = this.MySqlDatabase.Connection.CreateCommand() as MySqlCommand; cmd.CommandText = @"UPDATE Tasks SET Completed = NULL WHERE TaskId = @TaskId;"; cmd.Parameters.AddWithValue("@TaskId", input.TaskId); var recs = cmd.ExecuteNonQuery(); } [HttpPost] public void Archive(dto.TaskIdentifier input) { var cmd = this.MySqlDatabase.Connection.CreateCommand() as MySqlCommand; cmd.CommandText = @"UPDATE Tasks SET Archived = STR_TO_DATE(@Date, '%Y/%m/%d') WHERE TaskId = @TaskId;"; cmd.Parameters.AddWithValue("@TaskId", input.TaskId); cmd.Parameters.AddWithValue("@Date", DateTime.Now.ToString("yyyy/MM/dd")); var recs = cmd.ExecuteNonQuery(); } [HttpPost] public string Sms() { var input = Request.Form["Body"]; string response = null; var cmd = this.MySqlDatabase.Connection.CreateCommand() as MySqlCommand; cmd.CommandText = @"INSERT INTO Tasks(Text,Created) VALUES (@Text,STR_TO_DATE(@Date, '%Y/%m/%d'));"; cmd.Parameters.AddWithValue("@Text", input); cmd.Parameters.AddWithValue("@Date", DateTime.Now.ToString("yyyy/MM/dd")); var recs = cmd.ExecuteNonQuery(); if (recs == 1) response = "OK"; else response = "Sorry! I didn't get that."; return response; } } } 1 - thay vì sử dụng using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using MySql.Data.MySqlClient; using dto = TextTasks.Models; namespace TextTasks.Controllers { public class TasksController : Controller { private MySqlDatabase MySqlDatabase { get; set; } public TasksController(MySqlDatabase mySqlDatabase) { this.MySqlDatabase = mySqlDatabase; } [HttpPost] public void Complete(dto.TaskIdentifier input) { var cmd = this.MySqlDatabase.Connection.CreateCommand() as MySqlCommand; cmd.CommandText = @"UPDATE Tasks SET Completed = STR_TO_DATE(@Date, '%Y/%m/%d') WHERE TaskId = @TaskId;"; cmd.Parameters.AddWithValue("@TaskId", input.TaskId); cmd.Parameters.AddWithValue("@Date", DateTime.Now.ToString("yyyy/MM/dd")); var recs = cmd.ExecuteNonQuery(); } [HttpPost] public void Incomplete(dto.TaskIdentifier input) { var cmd = this.MySqlDatabase.Connection.CreateCommand() as MySqlCommand; cmd.CommandText = @"UPDATE Tasks SET Completed = NULL WHERE TaskId = @TaskId;"; cmd.Parameters.AddWithValue("@TaskId", input.TaskId); var recs = cmd.ExecuteNonQuery(); } [HttpPost] public void Archive(dto.TaskIdentifier input) { var cmd = this.MySqlDatabase.Connection.CreateCommand() as MySqlCommand; cmd.CommandText = @"UPDATE Tasks SET Archived = STR_TO_DATE(@Date, '%Y/%m/%d') WHERE TaskId = @TaskId;"; cmd.Parameters.AddWithValue("@TaskId", input.TaskId); cmd.Parameters.AddWithValue("@Date", DateTime.Now.ToString("yyyy/MM/dd")); var recs = cmd.ExecuteNonQuery(); } [HttpPost] public string Sms() { var input = Request.Form["Body"]; string response = null; var cmd = this.MySqlDatabase.Connection.CreateCommand() as MySqlCommand; cmd.CommandText = @"INSERT INTO Tasks(Text,Created) VALUES (@Text,STR_TO_DATE(@Date, '%Y/%m/%d'));"; cmd.Parameters.AddWithValue("@Text", input); cmd.Parameters.AddWithValue("@Date", DateTime.Now.ToString("yyyy/MM/dd")); var recs = cmd.ExecuteNonQuery(); if (recs == 1) response = "OK"; else response = "Sorry! I didn't get that."; return response; } } } 2
USE TextTasks; CREATE TABLE IF NOT EXISTS Tasks ( TaskId INT AUTO_INCREMENT, Text TEXT NOT NULL, Created DATE NOT NULL, Completed DATE, Archived DATE, PRIMARY KEY(TaskId) ); INSERT INTO Tasks(Text,Created) VALUES ('Initial test task 1', STR_TO_DATE('2019/07/04', '%Y/%m/%d')); INSERT INTO Tasks(Text,Created) VALUES ('Initial test task 2', STR_TO_DATE('2019/07/04', '%Y/%m/%d')); INSERT INTO Tasks(Text,Created) VALUES ('Initial test task 3', STR_TO_DATE('2019/07/04', '%Y/%m/%d')); 5
Sau đó, bạn chỉ cần thêm thuộc tính using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using MySql.Data.MySqlClient; using dto = TextTasks.Models; namespace TextTasks.Controllers { public class TasksController : Controller { private MySqlDatabase MySqlDatabase { get; set; } public TasksController(MySqlDatabase mySqlDatabase) { this.MySqlDatabase = mySqlDatabase; } [HttpPost] public void Complete(dto.TaskIdentifier input) { var cmd = this.MySqlDatabase.Connection.CreateCommand() as MySqlCommand; cmd.CommandText = @"UPDATE Tasks SET Completed = STR_TO_DATE(@Date, '%Y/%m/%d') WHERE TaskId = @TaskId;"; cmd.Parameters.AddWithValue("@TaskId", input.TaskId); cmd.Parameters.AddWithValue("@Date", DateTime.Now.ToString("yyyy/MM/dd")); var recs = cmd.ExecuteNonQuery(); } [HttpPost] public void Incomplete(dto.TaskIdentifier input) { var cmd = this.MySqlDatabase.Connection.CreateCommand() as MySqlCommand; cmd.CommandText = @"UPDATE Tasks SET Completed = NULL WHERE TaskId = @TaskId;"; cmd.Parameters.AddWithValue("@TaskId", input.TaskId); var recs = cmd.ExecuteNonQuery(); } [HttpPost] public void Archive(dto.TaskIdentifier input) { var cmd = this.MySqlDatabase.Connection.CreateCommand() as MySqlCommand; cmd.CommandText = @"UPDATE Tasks SET Archived = STR_TO_DATE(@Date, '%Y/%m/%d') WHERE TaskId = @TaskId;"; cmd.Parameters.AddWithValue("@TaskId", input.TaskId); cmd.Parameters.AddWithValue("@Date", DateTime.Now.ToString("yyyy/MM/dd")); var recs = cmd.ExecuteNonQuery(); } [HttpPost] public string Sms() { var input = Request.Form["Body"]; string response = null; var cmd = this.MySqlDatabase.Connection.CreateCommand() as MySqlCommand; cmd.CommandText = @"INSERT INTO Tasks(Text,Created) VALUES (@Text,STR_TO_DATE(@Date, '%Y/%m/%d'));"; cmd.Parameters.AddWithValue("@Text", input); cmd.Parameters.AddWithValue("@Date", DateTime.Now.ToString("yyyy/MM/dd")); var recs = cmd.ExecuteNonQuery(); if (recs == 1) response = "OK"; else response = "Sorry! I didn't get that."; return response; } } } 1 vào using System; namespace TextTasks.Models { public class Task { public int TaskId { get; set; } public string Text { get; set; } public DateTime? Completed { get; set; } } } 2 và //MySql services.AddTransient<MySqlDatabase>(_ => new MySqlDatabase("server=YOUR-MYSQL-ENDPOINT; database=texttasks; uid=YOUR-USER-NAME; pwd=YOUR-PASSWORD;")); 5 của mình. Điều này sẽ nằm trên dòng ngay phía trên khai báo lớp như được hiển thị cho using System; namespace TextTasks.Models { public class Task { public int TaskId { get; set; } public string Text { get; set; } public DateTime? Completed { get; set; } } } 2 trong đoạn mã sau
USE TextTasks; CREATE TABLE IF NOT EXISTS Tasks ( TaskId INT AUTO_INCREMENT, Text TEXT NOT NULL, Created DATE NOT NULL, Completed DATE, Archived DATE, PRIMARY KEY(TaskId) ); INSERT INTO Tasks(Text,Created) VALUES ('Initial test task 1', STR_TO_DATE('2019/07/04', '%Y/%m/%d')); INSERT INTO Tasks(Text,Created) VALUES ('Initial test task 2', STR_TO_DATE('2019/07/04', '%Y/%m/%d')); INSERT INTO Tasks(Text,Created) VALUES ('Initial test task 3', STR_TO_DATE('2019/07/04', '%Y/%m/%d')); 6
Bây giờ tất cả các trang của bạn đều được bảo mật và bạn sẽ buộc phải đăng nhập để xem ứng dụng của mình. Bạn có thể cấp quyền truy cập cho người dùng mới bằng cách thêm họ làm người dùng vào tài khoản Okta của mình. Ứng dụng mới của bạn đang ở điểm bắt đầu rất cơ bản mà bạn có thể tiếp tục thêm vào nếu muốn. Ví dụ: bạn có thể muốn thêm khả năng thêm và chỉnh sửa tác vụ từ trang web
Tìm hiểu thêm về làm việc với. NET lõi và MySQL
Bạn có thể tìm mã nguồn hoàn chỉnh trên GitHub tại đây. Thất bại sớm. Giữ nó đơn giản. Viết mã sạch. Tái cấu trúc, tái cấu trúc, tái cấu trúc. Kiểm tra, kiểm tra, kiểm tra. Chúc các bạn code vui vẻ
Đối với các ví dụ khác sử dụng. NET Core, MySQL và Okta SSO, hãy xem các liên kết sau
- Sử dụng Spring Boot và MySQL để vượt ra ngoài xác thực
- Xây dựng ứng dụng CRUD với ASP. NET lõi 2. 2 và máy chủ SQL
- Xây dựng ứng dụng CRUD đơn giản với ASP. NET Core và Vue
Như mọi khi, hãy để lại bình luận bên dưới và đừng quên theo dõi chúng tôi trên Twitter và đăng ký kênh YouTube của chúng tôi