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

【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 Index(){var list = await apiClient.GetAsync>("http://jb91api:9103/api/mermbers/mermber/list");return View(list.Response);}[HttpGet]public  IActionResult Create(){return View();}[HttpPost,ActionName("Create")]public async Task 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 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

更多相关:

  • Node.js 中文网Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。Node.js 的包管理器 npm,是全球最大的开源库生态系统。http://nodejs.cn/先安装nodejs 在自己的网站项目文件夹根目录...

  • 对象表示方式   1、第一种方式:使用new操作符后跟Object构造函数 var person = new Object();
    person.name = 'Nicholas';
    person.age = 29; 2、对象字面量表示法 var person = {name:'Nicholas',ag...

  • 1. 新兴的API requestAnimationFrame():是一个着眼于优化js动画的api,能够在动画运行期间发出信号。通过这种机制,浏览器就能够自动优化屏幕重绘操作 Page Visibility API:让开发人员知道用户什么时候正在看着页面,而什么时候页面是隐藏。 Geolocation API:在得到用户许可的情况下...

  • 英语的重要性,毋庸置疑!尤其对广大职场人士,掌握英语意味着就多了一项竞争的技能。那,对于我们成人来说,时间是最宝贵的。如何短时间内在英语方面有所突破,这是我们最关心的事情。英语学习,到底有没有捷径可以走,是否可以速成?周老师在这里明确告诉大家,英语学习,没有绝对的捷径走,但是可以少走弯路。十多年的教学经验告诉我们,成功的学习方法可以借...

  • 展开全部 其实IDLE提供了一个显32313133353236313431303231363533e78988e69d8331333365663438示所有行和所有字符的功能。 我们打开IDLE shell或者IDLE编辑器,可以看到左下角有个Ln和Col,事实上,Ln是当前光标所在行,Col是当前光标所在列。 我们如果想得到文件代码...

  • 前言[1]从 Main 方法说起[2]走进 Tomcat 内部[3]总结[4]《Java 2019 超神之路》《Dubbo 实现原理与源码解析 —— 精品合集》《Spring 实现原理与源码解析 —— 精品合集》《MyBatis 实现原理与源码解析 —— 精品合集》《Spring MVC 实现原理与源码解析 —— 精品合集》《Spri...

  • 【本文摘要】【注】本文所述内容为学习Yjango《学习观》相关视频之后的总结,观点归Yjango所有,本文仅作为学习之用。阅读本节,会让你对英语这类运动类知识的学习豁然开朗,你会知道英语学习方面,我们的症结所在。学习英语这类运动类知识,需要把握四个原则第一,不要用主动意识。第二,关注于端对端第三,输入输出符合实际情况第四,通过多个例子...

  • 点云PCL免费知识星球,点云论文速读。文章:RGB-D SLAM with Structural Regularities作者:Yanyan Li , Raza Yunus , Nikolas Brasch , Nassir Navab and Federico Tombari编译:点云PCL代码:https://github.co...