linux上編寫運行 dotnet core api

安裝 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:

 sudo apt-get install apt-transport-https
  sudo apt-get update
 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

 我想要改變端口,在網上找了一種方法:

var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.UseUrls("https://localhost:5001/")
.Build();

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的時候,自動生成的代碼:

    public class Program {
        public static void Main(string[] args) {
            CreateWebHostBuilder(args).Build().Run();
        }
        public static IWebHostBuilder CreateWebHostBuilder(string[] args) => 
            WebHost.CreateDefaultBuilder(args)
                .UseStartup <Startup> (); 
    }

發佈後運行結果:

IIS或者其它服務器上部署,端口配置,都有圖形化界面操作,不是什麼問題。我在linux上發佈了接口,然後window上的vue程序就可以請求了。先在postman中測試:

 

好了,這樣linux上的接口部署完畢,測試成功。         

dotnet core api 傳參 

1、get請求傳參

      [HttpGet]
        [Route("Items")]
        public JsonResult GetAll(int pageSize, int pageIndex)
        {
            AjaxResult result = new AjaxResult();
            var list = DbHelper.Select<Achievement>();

            var companys = DbHelper.Select<Company>();
            var users = DbHelper.Select<User>();

            //轉換爲ViewModel
            List<AchievementViewModel> models = new List<AchievementViewModel>();
            foreach (var item in list)
            {

                var vm = ModelConvertion.Convert<AchievementViewModel, Achievement>(item);
                var company = companys.SingleOrDefault(c => c.Id == item.CompanyId);
                vm.CompanyName = company == null ? "" : company.CompanyName;
                var user = users.SingleOrDefault(u => u.Id == item.Completer);
                vm.CompleterName = user == null ? "" : user.UserName;
                models.Add(vm);
            }

            result.Data = models.OrderByDescending(f => f.PublishDate).Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
            result.ItemCount = models.Count;
            return Json(result);

        }

        [HttpGet("{id}")]
        public ActionResult<Achievement> GetById(int id)
        {
            return DbHelper.SingleById<Achievement>(id);
        }

兩種方法,一個把參數放到路由裏,一個不放,都可以,根據情況決定。不建議在接收的時候,使用對象接收,因爲可能接收不到參數,對象前加上[FromUrl],不知道能不能收到,有興趣的同學可以嘗試。

2、post方法

        [HttpPost]
        [Authorize]
        public JsonResult item([FromBody] Achievement item)
        {
            AjaxResult result = new AjaxResult();
            try
            {
                if (DbHelper.Exist<Achievement>(b => b.Id == item.Id))
                {

                    result.IsSuccess = DbHelper.Update<Achievement>(item) > 0;
                }
                else
                {
                    result.IsSuccess = DbHelper.Insert<Achievement>(item, true) > 0;
                }
            }
            catch (Exception ex)
            {
                result.IsSuccess = false;
                result.Message = "保存出錯";
                this.Log().Error("保存出錯", ex);
            }
            return Json(result);
        }
        [HttpPost]
        [Route("[action]/{id}")]
         [Authorize]
        public ActionResult Delete(int id)
        {
            AjaxResult result = new AjaxResult();
            if (DbHelper.Delete<Achievement>(c => c.Id == id) > 0)
            {
                result.IsSuccess = true;
                UserManager.DeleteUserRef(id,2);
            }
            else
            {
                result.IsSuccess = false;
            }
            return Json(result);
        }

post時,數據也可以從路由來,也可以直接傳,接收時,如果以對象接收,前面加上[FromBody]。否則部署後,很有可能接收不到參數。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章