Asp.Net Web API不可以需要IIS。可以自己在主机上承载一个Web API
创建一个控制器项目的服务端
在Nuget中添加Microsoft.AspNet.WebApi.SelfHost
首先在服务端添加一个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)); } } }
在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/
然后启动服务端
创建一个控制台项目的客户端
在Nuget中添加Microsoft.AspNet.WebApi.Client
在客户端中添加一个与服务端具有相同属性的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; } } }
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,就创建一个WebRequestHandler实例,设置它的属性并将它传递给HttpClient构造函数
WebRequestHandler handler = new WebRequestHandler() { AllowAutoRedirect = false, UseProxy = false }; HttpClient client = new HttpClient(handler);
WebRequestHandler从HttpMessageHandler派生。您还可以通过从HttpMessageHandler派生插入自定义消息处理程序中