安装 Ubuntu

        dotnet core 跨平台已不再是梦,它带来的意义非凡,比如api接口可以在linux上编写及部署,也可以在windows上编写好,打包发布,然后copy到linux上部署从官网下载最新版本, 然后装到虚拟机VMware中。如果是centeros,系统开启后,默认进入命令行模式,估计一部分同学,看到类似dos界面,有点恐慌,不急,在命令行中输入startx回车,进入到图形界面。无论是哪种系统,虚拟机上装的操作系统,在开机启动后,都有可能窗口不能自适应,也就是说不能全屏,非常小。针对windows,直接运行VMware Tools即可。针对linux系统,我们直接双击是安装不了的。这是Ubuntu漂亮的紫色界面:

      

输入密码,登录到系统中。定位到VMware Tools安装目录,它还是tar.gz压缩文件,所以首先解压缩,用cd命令转到解压后的目录(直接打开目录,然后鼠标右键打开终端,就不用cd了),输入./vmware-install.pl,一路回车。

安装vscode

  从官网下载vscode,上面有注明操作系统。centeros是从redhat发展而来的。ubantu是基于Debian。前者擅长服务器端,后者主要是pc端。

  1、下载安装包 .deb package (64-bit)

  2、sudo apt install ./<file>.deb

  3、Then update the package cache and install the package using:

  1.   sudo apt-get install apt-transport-https
  2.   sudo apt-get update
  3.   sudo apt-get install code # or code-insiders

  linux上安装vscode的确能麻烦一些。安装完了后,不知道装到哪儿去了。于是就搜索vscode,没有找到,搜索全名也没有找到,后来发现名称叫code,终于搜索到了,把code加入到桌面的收藏夹里,就出现在桌面左侧,相当windows的桌面快捷方式。如下图:

   

 

部署dotnet core web API

     在命令行中,输入 dotnet  new webapi,结果不识别dotnet,它不是命令,建议安装.net core sdk,我装了最新的版本2.2。然后再运行命令创建api。

    打包发布的命令:dotnet publish –configuration Release

    自托管命令: dotnet ElectronInfoApi.dll

    默认监听的地址:https://localhost:5001

 

    我想要改变端口,在网上找了一种方法:

  1. var host = new WebHostBuilder()
  2. .UseKestrel()
  3. .UseContentRoot(Directory.GetCurrentDirectory())
  4. .UseIISIntegration()
  5. .UseStartup<Startup>()
  6. .UseUrls("https://localhost:5001/")
  7. .Build();
  8. host.Run();

  更改url或者端口都可以,这就是传说中的硬编码。因为上面的代码是在 Main(string[] args)方法里,所以可以从命令行传参,经过实践,这种方式是可以的。传参:dotnet ElectronInfoApi.dll  server.urls=https://192.168.19.1:9000,代码中接受参数:var  url=args.Length>0?args[0]:” “;

  还有另外一种方法,就是什么都不用修改,这是命令行创建api的时候,自动生成的代码:

  1. public class Program {
  2. public static void Main(string[] args) {
  3. CreateWebHostBuilder(args).Build().Run();
  4. }
  5. public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
  6. WebHost.CreateDefaultBuilder(args)
  7. .UseStartup <Startup> ();
  8. }

  发布后运行结果:

      

  IIS或者其它服务器上部署,端口配置,都有图形化界面操作,不是什么问题。我在linux上发布了接口,然后window上的vue程序就可以请求了。先在postman中测试:

     

  好了,这样linux上的接口部署完毕,测试成功。         

dotnet core api 传参 

  1、get请求传参

  1.    [HttpGet]
  2. [Route("Items")]
  3. public JsonResult GetAll(int pageSize, int pageIndex)
  4. {
  5. AjaxResult result = new AjaxResult();
  6. var list = DbHelper.Select<Achievement>();
  7. var companys = DbHelper.Select<Company>();
  8. var users = DbHelper.Select<User>();
  9. //转换为ViewModel
  10. List<AchievementViewModel> models = new List<AchievementViewModel>();
  11. foreach (var item in list)
  12. {
  13. var vm = ModelConvertion.Convert<AchievementViewModel, Achievement>(item);
  14. var company = companys.SingleOrDefault(c => c.Id == item.CompanyId);
  15. vm.CompanyName = company == null ? "" : company.CompanyName;
  16. var user = users.SingleOrDefault(u => u.Id == item.Completer);
  17. vm.CompleterName = user == null ? "" : user.UserName;
  18. models.Add(vm);
  19. }
  20. result.Data = models.OrderByDescending(f => f.PublishDate).Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
  21. result.ItemCount = models.Count;
  22. return Json(result);
  23. }
  24. [HttpGet("{id}")]
  25. public ActionResult<Achievement> GetById(int id)
  26. {
  27. return DbHelper.SingleById<Achievement>(id);
  28. }

   两种方法,一个把参数放到路由里,一个不放,都可以,根据情况决定。不建议在接收的时候,使用对象接收,因为可能接收不到参数,对象前加上[FromUrl],不知道能不能收到,有兴趣的同学可以尝试。

  2、post方法

  1. [HttpPost]
  2. [Authorize]
  3. public JsonResult item([FromBody] Achievement item)
  4. {
  5. AjaxResult result = new AjaxResult();
  6. try
  7. {
  8. if (DbHelper.Exist<Achievement>(b => b.Id == item.Id))
  9. {
  10. result.IsSuccess = DbHelper.Update<Achievement>(item) > 0;
  11. }
  12. else
  13. {
  14. result.IsSuccess = DbHelper.Insert<Achievement>(item, true) > 0;
  15. }
  16. }
  17. catch (Exception ex)
  18. {
  19. result.IsSuccess = false;
  20. result.Message = "保存出错";
  21. this.Log().Error("保存出错", ex);
  22. }
  23. return Json(result);
  24. }
  25. [HttpPost]
  26. [Route("[action]/{id}")]
  27. [Authorize]
  28. public ActionResult Delete(int id)
  29. {
  30. AjaxResult result = new AjaxResult();
  31. if (DbHelper.Delete<Achievement>(c => c.Id == id) > 0)
  32. {
  33. result.IsSuccess = true;
  34. UserManager.DeleteUserRef(id,2);
  35. }
  36. else
  37. {
  38. result.IsSuccess = false;
  39. }
  40. return Json(result);
  41. }

 

post时,数据也可以从路由来,也可以直接传,接收时,如果以对象接收,前面加上[FromBody]。否则部署后,很有可能接收不到参数。

 

版权声明:本文为wangqiang3311原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/wangqiang3311/p/10113325.html