C#?webApi創(chuàng)建與發(fā)布、部署、api調(diào)用詳細(xì)教程
一.創(chuàng)建web api項(xiàng)目
1.1、項(xiàng)目創(chuàng)建
MVC架構(gòu)的話,它會(huì)有view-model-control三層,在web api中它的前端和后端是分離的,所以只在項(xiàng)目中存在model-control兩層
1.2、修改路由
打開App_Start文件夾下,WebApiConfig.cs ,修改路由,加上{action}/ ,這樣就可以在api接口中通過接口函數(shù)名,來導(dǎo)向我們希望調(diào)用的api函數(shù),否則,只能通過controller來導(dǎo)向,就可能會(huì)造成有相同參數(shù)的不同名函數(shù),沖突。其中,{id}是api接口函數(shù)中的參數(shù)。
默認(rèn)路由配置信息為:【默認(rèn)路由模板無法滿足針對(duì)一種資源一種請(qǐng)求方式的多種操作?!?br />WebApi的默認(rèn)路由是通過http的方法(get/post/put/delete)去匹配對(duì)應(yīng)的action,也就是說webapi的默認(rèn)路由并不需要指定action的名稱
using System; using System.Collections.Generic; using System.Linq; using System.Web.Http; namespace WebAPI { public static class WebApiConfig { public static void Register(HttpConfiguration config) { // Web API 配置和服務(wù) // Web API 路由 config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", //修改路由,加上{action}/ ,這樣就可以在api接口中通過接口函數(shù)名,來導(dǎo)向我們希望調(diào)用的api函數(shù), //否則,只能通過controller來導(dǎo)向,就可能會(huì)造成有相同參數(shù)的不同名函數(shù),沖突。其中,{id}是api接口函數(shù)中的參數(shù) routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional } ); } } }
二.測(cè)試案例
寫一個(gè)測(cè)試的api函數(shù),并開始執(zhí)行(不調(diào)試)
2.1、我們?cè)趍odel文件夾中添加一個(gè)類movie
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace WebAPI.Models { public class movie { public string name { get; set; } public string director { get; set; } public string actor { get; set; } public string type { get; set; } public int price { get; set; } } }
2.1.2、我們?cè)趍odel文件夾中添加一個(gè)類Product
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace WebAPI.Models { public class Product { public int Id { get; set; } public string Name { get; set; } public string Category { get; set; } public decimal Price { get; set; } } }
2.2、在controller文件夾下添加web api控制器,命名改為TestController
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; using WebAPI.Models; namespace WebAPI.Controllers { public class TestController : ApiController { movie[] mymovie = new movie[] { new movie { name="海蒂和爺爺",director="阿蘭.葛斯彭納",actor="阿努克",type="動(dòng)漫",price=28}, new movie { name="云南蟲谷",director="佚名",actor="潘粵明",type="驚悚",price=32}, new movie { name="沙海",director="佚名",actor="吳磊",type="驚悚",price=28}, new movie { name="千與千尋",director="宮崎駿",actor="千尋",type="動(dòng)漫",price=28} }; public IEnumerable<movie> GetAllMovies() { return mymovie; } public IHttpActionResult GetMovie(string name) //異步方式創(chuàng)建有什么作用 { var mov = mymovie.FirstOrDefault((p) => p.name == name); if (mymovie == null) { return NotFound(); } return Ok(mymovie); } } }
這樣就完成了一個(gè)web api實(shí)例的編寫
2.2.2、在controller文件夾下添加web api控制器,命名改為productsController
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; using WebAPI.Models; namespace WebAPI.Controllers { public class productsController : ApiController { Product[] products = new Product[] { new Product { Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1 }, new Product { Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M }, new Product { Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M } }; public IEnumerable<Product> GetAllProducts() { return products; } public IHttpActionResult GetProduct(int id) { var product = products.FirstOrDefault((p) => p.Id == id); if (product == null) { return NotFound(); } return Ok(product); } } }
2.2.3、在controller文件夾下添加web api控制器,命名改為MyController
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; namespace WebAPI.Controllers { public class MyController : ApiController { [HttpGet] public string MyExample(string param1, int param2) { string res = ""; res = param1 + param2.ToString(); //這邊可以進(jìn)行任意操作,比如數(shù)據(jù)存入或者取出數(shù)據(jù)庫(kù)等 return res; } } }
三.本地調(diào)試
3.1 運(yùn)行調(diào)試,以本地 localhost(或127.0.0.1)形式訪問
①點(diǎn)擊工具欄【IIS Express】
②瀏覽地址輸入接口,看是否可以訪問
localhost:44381/api/products/GetAllProducts
注意:
這里的路徑是寫你的控制器前綴名稱(Control文件下的productsController控制器文件的前綴)
https://localhost:44381/api/Test/GetAllMovies
2)直接在瀏覽器中調(diào)試也行
想要調(diào)試的值,可以將WebApiConfig.cs的代碼修如下
using System; using System.Collections.Generic; using System.Linq; using System.Web.Http; namespace WebAPI { public static class WebApiConfig { public static void Register(HttpConfiguration config) { // Web API 配置和服務(wù) // Web API 路由 config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", //修改路由,加上{action}/ ,這樣就可以在api接口中通過接口函數(shù)名,來導(dǎo)向我們希望調(diào)用的api函數(shù), //否則,只能通過controller來導(dǎo)向,就可能會(huì)造成有相同參數(shù)的不同名函數(shù),沖突。其中,{id}是api接口函數(shù)中的參數(shù) routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional } ); //去掉xml返回格式、設(shè)置json字段命名采用 var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml"); config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType); } } }
ok,顯示成功
localhost:44381/api/My/MyExample?param1=¶m2=2
WebApi項(xiàng)目實(shí)例3-1
3-1 (1)新添加到控制器UserInfoController,
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; using WebAPI.Models; namespace WebAPI.Controllers { public class UserInfoController : ApiController { //檢查用戶名是否已注冊(cè) private ApiTools tool = new ApiTools(); // [HttpPost] [HttpGet] public HttpResponseMessage CheckUserName(string _userName) { int num = UserInfoGetCount(_userName);//查詢是否存在該用戶 if (num > 0) { return tool.MsgFormat(ResponseCode.操作失敗, "不可注冊(cè)/用戶已注冊(cè)", "1 " + _userName); } else { return tool.MsgFormat(ResponseCode.成功, "可注冊(cè)", "0 " + _userName); } } private int UserInfoGetCount(string username) { //return Convert.ToInt32(SearchValue("select count(id) from userinfo where username='" + username + "'")); return username == "admin" ? 1 : 0; } } }
添加返回(響應(yīng))類ApiTools
using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Text.RegularExpressions; using System.Web; namespace WebAPI.Models { //添加返回(響應(yīng))類 public class ApiTools { private string msgModel = "{{\"code\":{0},\"message\":\"{1}\",\"result\":{2}}}"; public ApiTools() { } public HttpResponseMessage MsgFormat(ResponseCode code, string explanation, string result) { string r = @"^(\-|\+)?\d+(\.\d+)?$"; string json = string.Empty; if (Regex.IsMatch(result, r) || result.ToLower() == "true" || result.ToLower() == "false" || result == "[]" || result.Contains('{')) { json = string.Format(msgModel, (int)code, explanation, result); } else { if (result.Contains('"')) { json = string.Format(msgModel, (int)code, explanation, result); } else { json = string.Format(msgModel, (int)code, explanation, "\"" + result + "\""); } } return new HttpResponseMessage { Content = new StringContent(json, System.Text.Encoding.UTF8, "application/json") }; } } public enum ResponseCode { 操作失敗 = 00000, 成功 = 10200, } }
3-1 (2)本地調(diào)試,調(diào)用Web API接口
運(yùn)行調(diào)試,以本地 localhost(或127.0.0.1)形式訪問
①點(diǎn)擊工具欄【IIS Express】
②瀏覽地址輸入接口,看是否可以訪問
https://localhost:44381/api/UserInfo/CheckUserName?_userName=wxd
3.2 運(yùn)行調(diào)試,以本地IP(192.168.6.152)形式訪問
127.0.0.1是回路地址,來檢驗(yàn)本機(jī)TCP/IP協(xié)議棧,實(shí)際使用過程中服務(wù)端不在本機(jī),是外部地址,要用IP地址測(cè)試。
外部用戶采用IP+端口號(hào)訪問,如下圖瀏覽器訪問不了,400錯(cuò)誤。
解決方案:
因?yàn)?IIS 7 采用了更安全的 web.config 管理機(jī)制,默認(rèn)情況下會(huì)鎖住配置項(xiàng)不允許更改。
以管理員身份運(yùn)行命令行【此處不要操作】
C:\windows\system32\inetsrv\appcmd unlock config -section:system.webServer/handlers
如果modules也被鎖定,再運(yùn)行
C:\windows\system32\inetsrv\appcmd unlock config -section:system.webServer/modules
客戶端程序:調(diào)用接口分為以下幾種情況:
通過Javascript 和 jQuery 調(diào)用 Web API
右鍵資源管理器解決方案下面的項(xiàng)目,添加-新建項(xiàng)
將index.html內(nèi)容替換成:
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Product App</title> </head> <body> <div> <h2>All Products</h2> <ul id="products" /> </div> <div> <h2>Search by ID</h2> <input type="text" id="prodId" size="5" /> <input type="button" value="Search" onclick="find();" /> <p id="product" /> </div> <script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.0.3.min.js"></script> <script> var uri = 'api/Products'; $(document).ready(function () { // Send an AJAX request $.getJSON(uri) .done(function (data) { // On success, 'data' contains a list of products. $.each(data, function (key, item) { // Add a list item for the product. $('<li>', { text: formatItem(item) }).appendTo($('#products')); }); }); }); function formatItem(item) { return item.Name + ': $' + item.Price; } function find() { var id = $('#prodId').val(); $.getJSON(uri + '/' + id) .done(function (data) { $('#product').text(formatItem(data)); }) .fail(function (jqXHR, textStatus, err) { $('#product').text('Error: ' + err); }); } </script> </body> </html>
四.發(fā)布web api 并部署
4.1、首先,右鍵項(xiàng)目,選擇發(fā)布:
到這里,程序已經(jīng)發(fā)布到指定的路徑下了(這里的路徑,可以是本機(jī)的文件夾,也可以是服務(wù)器上的ftp路徑)
4.2、我們還剩最后一步,就是,在IIS上,把發(fā)布的服務(wù)端程序掛上去,不說了,直接上圖:
打開iis,選中網(wǎng)站,右鍵 添加網(wǎng)站,
好了,服務(wù)端程序發(fā)布并部署完成。
這個(gè)WebAPI就是剛剛我們部署好的,點(diǎn)擊下圖右側(cè)的瀏覽*91(http),會(huì)打開網(wǎng)頁(yè)
總結(jié)
到此這篇關(guān)于C# webApi創(chuàng)建與發(fā)布、部署、api調(diào)用的文章就介紹到這了,更多相關(guān)C# webApi創(chuàng)建發(fā)布部署、api調(diào)用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
DevExpress之ChartControl創(chuàng)建Drill-Down樣式的Title實(shí)例
這篇文章主要介紹了DevExpress之ChartControl創(chuàng)建Drill-Down樣式的Title實(shí)現(xiàn)方法,以實(shí)例形式講述了創(chuàng)建Drill-Down樣式的Title原理與實(shí)現(xiàn)過程,需要的朋友可以參考下2014-10-10C#實(shí)現(xiàn)金額轉(zhuǎn)換成中文大寫金額
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)金額轉(zhuǎn)換成中文大寫金額,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08運(yùn)用示例簡(jiǎn)單講解C#取消令牌CancellationTokenSource
這篇文章運(yùn)用示例簡(jiǎn)單講解C#取消令牌CancellationTokenSource,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08C#實(shí)現(xiàn)在啟動(dòng)目錄創(chuàng)建快捷方式的方法
這篇文章主要介紹了C#實(shí)現(xiàn)在啟動(dòng)目錄創(chuàng)建快捷方式的方法,涉及C#快捷方式的創(chuàng)建技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09winform模擬鼠標(biāo)按鍵的具體實(shí)現(xiàn)
這篇文章介紹了winform模擬鼠標(biāo)按鍵的具體實(shí)現(xiàn),有需要的朋友可以參考一下2013-10-10C#使用Dispose模式實(shí)現(xiàn)手動(dòng)對(duì)資源的釋放
這篇文章主要介紹了C#使用Dispose模式實(shí)現(xiàn)手動(dòng)對(duì)資源的釋放,涉及C#采用Dispose模式操作資源的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08Unity shader實(shí)現(xiàn)百葉窗特效
這篇文章主要為大家詳細(xì)介紹了Unity shader實(shí)現(xiàn)百葉窗特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11C#實(shí)現(xiàn)獲取電腦硬件顯卡核心代號(hào)信息
這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)獲取電腦硬件顯卡核心代號(hào)信息,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01