日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

【Step By Step】将Dotnet Core部署到Docker下

發(fā)布時(shí)間:2023/11/27 生活经验 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Step By Step】将Dotnet Core部署到Docker下 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、使用.Net Core構(gòu)建WebAPI并訪問(wèn)Docker中的Mysql數(shù)據(jù)庫(kù)

這個(gè)的過(guò)程大概與我之前的文章《嘗試.Net Core—使用.Net Core + Entity FrameWork Core構(gòu)建WebAPI(一)》一致。

但是在我們這里,由于docker中無(wú)法部署sql server,所以我采用了Mysql數(shù)據(jù)庫(kù),順便吐槽一下 SQL Server真的太貴了,阿里云的Mysql實(shí)例價(jià)格和SQL Server實(shí)例價(jià)格差10倍,真的好夸張。

Mysql官方的EF Core支持剛剛出來(lái),由于文章是后續(xù)補(bǔ)充的,在我嘗試的時(shí)候官方驅(qū)動(dòng)還沒(méi)有出,所以我使用的是第三方的驅(qū)動(dòng):Pomelo.EntityFrameworkCore.MySql,據(jù)說(shuō)是國(guó)內(nèi)一個(gè)90后的小伙兒寫(xiě)的,非常牛X. ?

引用之后,就和EF訪問(wèn)SQL Server沒(méi)有什么區(qū)別了,但是:由于我們的Mysql實(shí)例是安裝在Docker容器中的,那兩個(gè)Docker容器之間怎么互相通信呢?

首先在啟動(dòng)API Image的時(shí)候,需要使用--link 命令,來(lái)建立API和Mysql 容器之間的訪問(wèn)通道,大概命令如下:

docker run -it -p 9100:9100 --name testapi --link msyqldb:msyqldb testapi

在Link的時(shí)候我們給需要連接的容器起了一個(gè)別名,這個(gè)別名就是一個(gè)主機(jī)名一樣,可以直接用來(lái)訪問(wèn),這個(gè)時(shí)候我們的連接字符串就類似于:

Data Source=mysqldb;port=3306;Initial Catalog=數(shù)據(jù)庫(kù)名稱;Integrated Security=False;Persist Security Info=False;User ID=用戶名;Password=密碼

這里,我們的DataSource,也就是實(shí)例的名稱,就直接寫(xiě)主機(jī)名,也就是我們?cè)贚ink的時(shí)候起的那個(gè)別名,就OK啦~只要你突破了這點(diǎn),那訪問(wèn)基本上就沒(méi)有什么問(wèn)題了。

Coding 工作結(jié)束之后,發(fā)布你的API,并且最終打包成Image,啟動(dòng)容器,這一系列過(guò)程可以參考我的上一篇文章:《【Step By Step】將Dotnet Core部署到Docker上》

二、使用.Net Core構(gòu)建一個(gè)Web程序并訪問(wèn)Docker中的WebAPI

在Docker中的Web程序訪問(wèn)另外一個(gè)Docker容器中的API, 需要解決的問(wèn)題如下:

1.API的路徑是啥?

2.跨域問(wèn)題

其中第一個(gè)問(wèn)題的解決思路和我們上面連接數(shù)據(jù)庫(kù)的解決思路是完全一致的,只要在Link的時(shí)候,加上別名,就可以用http://別名:端口號(hào)?來(lái)訪問(wèn)你的api即可。

第二個(gè)問(wèn)題不僅僅是在docker中會(huì)遇到的問(wèn)題,在平時(shí)我們開(kāi)發(fā)Web程序時(shí),也會(huì)遇到這樣子的問(wèn)題,常用的解決方案有以下幾種:

A.避免用js訪問(wèn)API,而采用后端代碼去調(diào)用,就沒(méi)有跨域這一說(shuō)了

B.后端API HttpHeader增加Access-Control-Allow-Origin:*?Access-Control-Allow-Headers:Content-type ?Access-Control-Allow-Methods:GET, POST, PUT, DELETE, OPTIONS三個(gè)選項(xiàng)

C.Jsonp,就是把數(shù)據(jù)當(dāng)做一個(gè)js文件來(lái)加載~

這里我采用方法A來(lái)解決跨域問(wèn)題(簡(jiǎn)單、暴力、最徹底):

第一步:通過(guò)Nuget引用Orion.ApiClientLight類庫(kù),這是一個(gè)封裝了一系列調(diào)用api方法的類庫(kù),我們可以通過(guò)他很方便的調(diào)用API并序列化結(jié)果

第二步:在Controller中初始化APIClient對(duì)象,JsonApiClientLight apiClient = new JsonApiClientLight();

第三步:調(diào)用方法來(lái)訪問(wèn)API。

下面的代碼是我調(diào)用一個(gè)CRUD的API來(lái)訪問(wèn)API的簡(jiǎn)單實(shí)現(xiàn):

  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");}}

?

轉(zhuǎn)載于:https://www.cnblogs.com/baiyunchen/p/5881360.html

總結(jié)

以上是生活随笔為你收集整理的【Step By Step】将Dotnet Core部署到Docker下的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。