【Step By Step】将Dotnet Core部署到Docker下
一、使用.Net Core構建WebAPI并訪問Docker中的Mysql數據庫
這個的過程大概與我之前的文章《嘗試.Net Core—使用.Net Core + Entity FrameWork Core構建WebAPI(一)》一致。
但是在我們這里,由于docker中無法部署sql server,所以我采用了Mysql數據庫,順便吐槽一下 SQL Server真的太貴了,阿里云的Mysql實例價格和SQL Server實例價格差10倍,真的好夸張。
Mysql官方的EF Core支持剛剛出來,由于文章是后續補充的,在我嘗試的時候官方驅動還沒有出,所以我使用的是第三方的驅動:Pomelo.EntityFrameworkCore.MySql,據說是國內一個90后的小伙兒寫的,非常牛X. ?
引用之后,就和EF訪問SQL Server沒有什么區別了,但是:由于我們的Mysql實例是安裝在Docker容器中的,那兩個Docker容器之間怎么互相通信呢?
首先在啟動API Image的時候,需要使用--link 命令,來建立API和Mysql 容器之間的訪問通道,大概命令如下:
docker run -it -p 9100:9100 --name testapi --link msyqldb:msyqldb testapi
在Link的時候我們給需要連接的容器起了一個別名,這個別名就是一個主機名一樣,可以直接用來訪問,這個時候我們的連接字符串就類似于:
Data Source=mysqldb;port=3306;Initial Catalog=數據庫名稱;Integrated Security=False;Persist Security Info=False;User ID=用戶名;Password=密碼 這里,我們的DataSource,也就是實例的名稱,就直接寫主機名,也就是我們在Link的時候起的那個別名,就OK啦~只要你突破了這點,那訪問基本上就沒有什么問題了。
Coding 工作結束之后,發布你的API,并且最終打包成Image,啟動容器,這一系列過程可以參考我的上一篇文章:《【Step By Step】將Dotnet Core部署到Docker上》
二、使用.Net Core構建一個Web程序并訪問Docker中的WebAPI
在Docker中的Web程序訪問另外一個Docker容器中的API, 需要解決的問題如下:
1.API的路徑是啥?
2.跨域問題
其中第一個問題的解決思路和我們上面連接數據庫的解決思路是完全一致的,只要在Link的時候,加上別名,就可以用http://別名:端口號?來訪問你的api即可。
第二個問題不僅僅是在docker中會遇到的問題,在平時我們開發Web程序時,也會遇到這樣子的問題,常用的解決方案有以下幾種:
A.避免用js訪問API,而采用后端代碼去調用,就沒有跨域這一說了
B.后端API HttpHeader增加Access-Control-Allow-Origin:*?Access-Control-Allow-Headers:Content-type ?Access-Control-Allow-Methods:GET, POST, PUT, DELETE, OPTIONS三個選項
C.Jsonp,就是把數據當做一個js文件來加載~
這里我采用方法A來解決跨域問題(簡單、暴力、最徹底):
第一步:通過Nuget引用Orion.ApiClientLight類庫,這是一個封裝了一系列調用api方法的類庫,我們可以通過他很方便的調用API并序列化結果
第二步:在Controller中初始化APIClient對象,JsonApiClientLight apiClient = new JsonApiClientLight();
第三步:調用方法來訪問API。
下面的代碼是我調用一個CRUD的API來訪問API的簡單實現:
public class HomeController : Controller{JsonApiClientLight apiClient = new JsonApiClientLight();public async Task<IActionResult> Index(){var list = await apiClient.GetAsync<List<Member>>("http://jb91api:9103/api/mermbers/mermber/list");return View(list.Response);}[HttpGet]public IActionResult Create(){return View();}[HttpPost,ActionName("Create")]public async Task<IActionResult> CreatePost(CreateMember model){if(ModelState.IsValid){var member = await apiClient.PostAsync("http://jb91api:9103/api/mermbers/mermber/", model);return RedirectToAction("Index");}return View(model);}public async Task<IActionResult> Delete(int id){if (id > 0){await apiClient.DeleteAsync("http://jb91api:9103/api/mermbers/mermber?id=" + id.ToString());}return RedirectToAction("Index");}}
?
轉載于:https://www.cnblogs.com/baiyunchen/p/5881360.html
總結
以上是生活随笔為你收集整理的【Step By Step】将Dotnet Core部署到Docker下的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一桶水多少钱啊?
- 下一篇: Codeforces Round #37