<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Loading

      AServer - 基于Asp.net core Kestrel的超迷你http服務器

        AServer是基于ASP.NET Core Kestrel封裝的一個超迷你http服務器。它可以集成進你的Core程序里,用來快速的響應Http請求,而不需要集成整個ASP.NET Core MVC 框架。

      一:什么是ASever?

        AServer就像它的名字一樣,Just a server,它的功能非常簡單,它唯一的功能就是用來對Http請求做出響應。以前我們開發一個.NET程序,比如控制臺程序,Windows服務等,如果需要對外提供接口,我們通常會在程序里集成WCF,使用WCF對外提供RPC接口。但是現在是.NET Core的時代,我們已經沒有辦法選擇WCF了。而且這些需求往往很簡單,只是想要對外提供幾個接口,查詢一些數據,或者觸發一些功能,如果我們集成整個ASP.NET Core MVC框架又覺得是殺雞用牛刀的感覺。這個時候你或許可以選擇AServer。AServer很簡單,它僅僅是一個dll,這或許正是你想要的。

      github地址:https://github.com/kklldog/AServer 歡迎star。

      二:使用AServer

        如何使用AServer呢,非常簡單,讓我們看幾個示例代碼就明白了。假設我們現在有個跑定時任務的控制臺程序,這個程序需要對外提供3個Http接口:

        1.查詢所有任務

        2.新增一個任務

        3.刪除一個任務

        下面演示如何使用AServer來實現這3個接口。

        1.新建一個Core的控制臺程序

        

       

        2.從nuget安裝AServer

        

        3.實例化一個Server

        直接new一個Server對象,它默認會監聽本地5000端口。

            static void Main(string[] args)
              {
                  var server  = new Agile.AServer.Server();
              }

        4.實現查詢所有任務接口

        該接口的請求地址為/api/tasks,請求方法為GET,返回任務列表數組。

                 server.AddHandler(new HttpHandler()
                  {
                      Method = "GET",
                      Path = "/api/tasks",
                      Handler = (req, resp) =>
                      {
                          return resp.Write("['Task1','Task2','Task3']");
                      }
                  });

        5.實現新增任務接口

        該接口的請求地址為/api/tasks,請求方法為POST,如果新增成功則返回文本"ok"。

                  //新增任務
                  server.AddHandler(new HttpHandler()
                  {
                      Method = "POST",
                      Path = "/api/tasks",
                      Handler = (req, resp) =>
                      {
                          var task = req.BodyContent;
                          Console.WriteLine(task);
      
                          return resp.Write("ok");
                      }
                  });

        6.實現刪除任務接口

        該接口的請求地址為/api/tasks/:taskId,請求方法為DELETE,如果刪除成功則返回文本"ok"。

                  //刪除任務
                  server.AddHandler(new HttpHandler()
                  {
                      Method = "DELETE",
                      Path = "/api/tasks/:taskId",
                      Handler = (req, resp) =>
                      {
                          var taskId = req.Params.taskId;
                          Console.WriteLine("delete "+taskId);
      
                          return resp.Write("ok");
                      }
                  });

        7.啟動服務器

        調用Server.Run()方法啟動服務器。

       //啟動服務器
                  server.Run();
      
                  Console.WriteLine("Task server is running now .");
                  Console.Read();

        8.測試

        至此,演示代碼編寫完了。運行這個控制臺程序,然后用postman來測試下這3個接口,是否能響應我們預期的結果。

        

        測試查詢任務接口

        

        測試新增任務接口

        

        測試刪除任務接口

        

        可以看到我們對這3個接口的測試都返回了預期的值,說明AServer正確的響應了我們的請求。

        9.通過繼承HttpHandlerController實現接口

        另外,還可以通過繼承HttpHandlerController來處理http請求。該方法更接近ASP.NET MVC慣用的方法。編寫一個class繼承自HttpHandlerController,對里面的方法添加[HttpHandler] attribute來指定請求地址跟方法。需要注意的是里面的方法我們約定了簽名:Task (Reqeust,Response)。

        下面的代碼演示了如果通過繼承HttpHandlerController來實現一系列汽車信息管理的api接口:

        

       public class ApiController : HttpHandlerController
          {
              public class car
              {
                  public string id { get; set; }
                  public string name { get; set; }
              }
      
              [HttpHandler("/api/cars", "GET")]
              public Task GetAllCars(Request req, Response resp)
              {
                  List<car> cars = new List<car>();
                  cars.Add(new car { name = "ae86" });
                  cars.Add(new car { name = "911" });
      
                  var json = JsonConvert.SerializeObject(cars);
      
                  return resp.WriteJson(json);
              }
      
              [HttpHandler("/api/cars/:name", "GET")]
              public Task GetCar(Request req, Response resp)
              {
                  var name = req.Params.name;
      
                  List<car> cars = new List<car>();
                  cars.Add(new car { id="001", name = "ae86" });
                  cars.Add(new car { id="002",name = "911" });
      
                  var car = cars.FirstOrDefault(c => c.name == name);
                  if (car != null)
                  {
                      var json = JsonConvert.SerializeObject(car);
                      return resp.WriteJson(json);
                  }
                  else
                  {
                      return resp.Write("NotFound", HttpStatusCode.NotFound, null);
                  }
              }
      
              [HttpHandler("/api/cars","POST")]
              public Task AddCar(Request req, Response resp)
              {
                  var car = req.Body<car>();
                  //mock return id
                  var json = JsonConvert.SerializeObject(car);
                  return resp.WriteJson(json);
              }
      
              [HttpHandler("/api/cars/001", "PUT")]
              public Task UpdateCar(Request req, Response resp)
              {
                  var car = req.Body<car>();
                  //mock return id
                  var json = JsonConvert.SerializeObject(car);
                  return resp.WriteJson(json);
              }
      
              [HttpHandler("/api/cars/001","DELETE")]
              public Task DeleteCar(Request req, Response resp)
              {
                  //delete car
                  //...
      
                  return resp.WriteJson("ok");
              }
          }
        。。。

        //加載ApiController
        server.AddController<ApiController>();

        10.Request/Response

        通過上面的演示代碼,不難發現,AServer對Http請求的處理都封裝在HttpHandler對象中。HttpHandler類有3個屬性,Method,Path,Handler。Method表示Http請求的方式,Path表示請求的路徑,Handler是一個Func,業務邏輯就寫在這里。Handler的這個Func的方法簽名為Task (Request,Response)。

      其中Request封裝了本次Http請求的請求部分的參數,它會解析Http請求,把headers,queryStrings,params解析成dynamic對象,所以調用參數的時候跟寫JavaScript類似,如:

      var name = req.Params.name;
      var id = req.Query.id;
      var contentType = req.Header.contentType;

      Response則封裝了幾個Write方法,用來寫響應的內容,狀態碼,Header等內容,如:

      resp.Write("ok");
      resp.Write("NotFound", HttpStatusCode.NotFound, null);
      var headers = new List<KeyValuePair<string, string>>();
      headers.Add(new KeyValuePair<string, string>("Content-Type", "charset=utf-8"));
      resp.Write($"user 001 be deleted .", HttpStatusCode.OK, headers);
      resp.WriteJson("{name:'kklldog'}");

       

      三:總結

        對于AServer的介紹也差不多了。希望對同學們有幫助。AServer雖然功能很簡單,就是對Http請求做出響應。但是我也可以說AServer的功能很強大,因為它能對Http請求做出響應。因為從Http的本質上來說,AServer幾乎可以實現所有基于Http的功能。我們可以用它來實現restful api,可以用來實現各種管理系統,可以用來實現cms系統。。。

        不管使用ASP.NET MVC或者JSP或者node express等web框架開發bs/web系統的時候其實套路都是一樣的,概況一下就這么幾步:

        1.攔截請求(路由)

        2.解析請求攜帶的參數(url,headers,querystrings,body等)

        3.根據參數處理業務(查數據,持久數據等)

        4.根據業務處理結果做出響應(html,json,xml等)

        我們只要了解這個套路,不管用什么技術,什么框架,其實都是一樣的,只要查下api,弄明白怎么獲取http請求的參數,怎么做出響應。AServer也實現了這個套路。如果有心的話,對AServer實現過濾器,參數綁定,視圖引擎等功能,那基本上就是一個簡易的mvc框架了。當然如果你的業務復雜,請選用ASP.NET Core MVC,它功能強大,性能強悍;如果你只是需要實現幾個簡單的Http接口,可以考慮AServer來實現。

       

          
      關注我的公眾號一起玩轉技術   
      posted @ 2018-10-22 09:54  Agile.Zhou  閱讀(5207)  評論(3)    收藏  舉報
      主站蜘蛛池模板: 麻豆麻豆麻豆麻豆麻豆麻豆| 久久不见久久见www日本| 日本欧美大码aⅴ在线播放| 国产精品综合av一区二区国产馆| 亚洲国产成人精品综合色| 5555国产在线观看| 中文字幕无码av不卡一区| 99久久久无码国产麻豆| 在线精品自拍亚洲第一区| 色婷婷久久综合中文久久一本 | 国产av最新一区二区| 中文字幕日韩有码一区| 部精品久久久久久久久| 日本一区不卡高清更新二区| 久久精品无码中文字幕| 婷婷综合缴情亚洲| 国产乱码精品一区二区三上| 欧美性群另类交| 国产午夜福利视频合集| 狠狠躁夜夜躁人人爽天天古典| 又爽又黄又无遮挡的视频| 亚洲av无码精品色午夜蛋壳| 久久―日本道色综合久久| 国产午夜福利精品久久不卡| 亚洲国产美女精品久久久| 国产熟女av一区二区三区| 日韩av一区二区三区精品| 天天影视色香欲综合久久| 老色鬼永久精品网站| 东京热大乱系列无码| 一区二区中文字幕久久| 国产一区二区三区精品片| 免费人欧美成又黄又爽的视频| 少妇人妻真实偷人精品| 中文字幕av中文字无码亚| 少妇愉情理伦片丰满丰满午夜| 精选国产av精选一区二区三区| 亚洲一区av在线观看| 青青青爽在线视频观看| 香蕉av777xxx色综合一区| 中文在线а√天堂|