Asp.Net Web API不可以需要IIS。可以自己在主機上承載一個Web API 創建WebAPI.Server項目 創建一個控制器項目的服務端 在Nuget中添加Microsoft.AspNet.WebApi.SelfHost 創建Model與Controller 首先在服務端添加一個Pro ...
Asp.Net Web API不可以需要IIS。可以自己在主機上承載一個Web API
創建WebAPI.Server項目
創建一個控制器項目的服務端
在Nuget中添加Microsoft.AspNet.WebApi.SelfHost
創建Model與Controller
首先在服務端添加一個Product類型
namespace WebAPI.Server.Models { public class Product { public int Id { get; set; } public string Name { get; set; } public string Category { get; set; } public decimal Price { get; set; } } }
然後添加一個ProductController控制器,這個控制器繼承於Sytem.Web.Http.ApiController。記得擴展引用System.Web.Http
using System.Collections.Generic; using System.Linq; using System.Net; using System.Web.Http; using WebAPI.Server.Models; namespace WebAPI.Server.Controller { public class ProductController:ApiController { private static IList<Product> products; static ProductController() { products = new List<Product>(); products.Add(new Product { Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1 }); products.Add(new Product { Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M }); products.Add(new Product { Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M }); } /// <summary> /// 獲取所有商品 /// </summary> /// <returns></returns> public IEnumerable<Product> GetProducts() { return products; } /// <summary> /// 獲取商品 /// </summary> /// <param name="id"></param> /// <returns></returns> public Product GetProductById(int id) { var product = products.FirstOrDefault((p) => p.Id == id); if (product == null) { throw new HttpResponseException(HttpStatusCode.NotFound); } return product; } /// <summary> /// 添加商品 /// </summary> /// <param name="product"></param> public void PostProduct(Product product) { products.Add(product); } /// <summary> /// 修改商品 /// </summary> /// <param name="id"></param> /// <param name="product"></param> public void PutProduct(int id,Product product) { var pro= products.SingleOrDefault(y => y.Id == id); pro.Category = product.Category; pro.Name = product.Name; pro.Price = product.Price; } /// <summary> /// 刪除商品 /// </summary> /// <param name="id"></param> public void DeleteProduct(int id) { products.Remove(products.SingleOrDefault(y => y.Id == id)); } } }
承載Web API
在Program類中添加如下引用
using System.Http; using System.Web.Http.SelfHost;
然後再添加如下代碼
using System; using System.Web.Http; using System.Web.Http.SelfHost; namespace WebAPI.Server { class Program { static void Main(string[] args) { //創建HTTP服務的配置類 var config = new HttpSelfHostConfiguration("http://localhost:7777"); config.Routes.MapHttpRoute( "API Default","api/{Controller}/{id}", new { id=RouteParameter.Optional} ); //創建System.Web.Http的實現類 using (HttpSelfHostServer server = new HttpSelfHostServer(config)) { server.OpenAsync().Wait(); Console.WriteLine("服務端已開啟"); Console.Read(); } } } }
這個應用程式監聽“http://localhost:7777”。預設情況下,偵聽一個特殊的HTTP URL是需要管理員許可權的。運行上面應用程式時,可能會得到這樣一個錯誤:“HTTP could not register URL http://+:7777",這兒有兩種方式去避免這個錯誤:
1.以管理員身份運行Visual Studio。
2.使用Netsh.exe給與你的賬號許可權去保留這個URL。
若要使用Netsh.exe,以管理員身份打開命令提示框,並鍵入以下命令:
netsh http add urlacl url=http://+:7777/ user=machine\username
其中machine\username是您的用戶帳戶。
當你使用完自托管的時候,最好是確定刪除這個保留的URL。
netsh http delete urlacl url=http://+:7777/
然後啟動服務端
創建WebAPI.Client 項目
創建一個控制台項目的客戶端
在Nuget中添加Microsoft.AspNet.WebApi.Client
添加Model
在客戶端中添加一個與服務端具有相同屬性的Product的實體模型
namespace WebAPI.Client.Models { class Product { public int Id { get; set; } public string Name { get; set; } public string Category { get; set; } public decimal Price { get; set; } } }
創建HttpClient輔助類
using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Text; using System.Threading.Tasks; using WebAPI.Client.Models; namespace WebAPI.Client { public class MyHtppClient { HttpClient client; public MyHtppClient(String uri) { //初始化客戶端 client = new HttpClient(); client.BaseAddress = new Uri(uri); //為請求頭添加一項。 client.DefaultRequestHeaders.Accept.Add( new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json") ); } /// <summary> /// 獲取所有商品 /// </summary> public void GetAll() { //獲取 HttpResponseMessage message = client.GetAsync("api/product").Result; if(message.IsSuccessStatusCode) {//成功返回 var produsts = message.Content.ReadAsAsync<IEnumerable<Product>>().Result; foreach (var item in produsts) { Console.WriteLine($"商品編號:{item.Id};商品名稱:{item.Name};商品價格:{item.Price};商品類型:{item.Category}"); } } } public void GetbyId(int id) { HttpResponseMessage message = client.GetAsync($"api/product/{id}").Result; if(message.IsSuccessStatusCode) { var product = message.Content.ReadAsAsync<Product>().Result; Console.WriteLine($"商品編號:{product.Id};商品名稱:{product.Name};商品價格:{product.Price};商品類型:{product.Category}"); } } public void Add(Product product) { HttpResponseMessage message = client.PostAsJsonAsync("api/product", product).Result; Console.WriteLine("{0} ({1})", (int)message.StatusCode, message.ReasonPhrase); } public void Modify(int id,Product product) { HttpResponseMessage message = client.PutAsJsonAsync($"api/product/{id}", product).Result; Console.WriteLine("{0} ({1})", (int)message.StatusCode, message.ReasonPhrase); } public void Delete(int id) { HttpResponseMessage message = client.DeleteAsync($"api/product/{id}").Result; Console.WriteLine("{0} ({1})", (int)message.StatusCode, message.ReasonPhrase); } } }
然後我們在main方法中測試所有方法
namespace WebAPI.Client { class Program { static void Main(string[] args) { MyHtppClient myHtppClient = new MyHtppClient("http://localhost:7777"); myHtppClient.GetAll(); } } }
其它方法在這就不再做測試
配置HttpClient
如果要配置HttpClient,就創建一個WebRequestHandler實例,設置它的屬性並將它傳遞給HttpClient構造函數
WebRequestHandler handler = new WebRequestHandler() { AllowAutoRedirect = false, UseProxy = false }; HttpClient client = new HttpClient(handler);
WebRequestHandler從HttpMessageHandler派生。您還可以通過從HttpMessageHandler派生插入自定義消息處理程式中