Asp.Net Web API不可以需要IIS。可以自己在主機上承載一個Web API
建立WebAPI.Server項目
建立一個控制器項目的服務端
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuEzY2kzYjZjZiZjZwMzY4UjZjJ2NlNTM0Q2YmNTZ2U2MfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
在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派生插入自定義消息處理程式中