zoukankan      html  css  js  c++  java
  • Asp.Net Web API(六)

         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=machineusername

    其中machineusername是您的用户帐户。

    当你使用完自托管的时候,最好是确定删除这个保留的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);

    WebRequestHandlerHttpMessageHandler派生。您还可以通过从HttpMessageHandler派生插入自定义消息处理程序中

  • 相关阅读:
    css添加方法
    node + vue 实现服务端单向推送消息,利用EventSource
    获取公众号openid,通过unionid 和小程序用户绑定起来
    小程序 构建npm
    powershell禁止系统运行脚本
    mongoose 删除
    mongoose 查询
    moogoose 更新
    小程序,用户授权手机号,node需要检验和解析
    小程序:支付的时候缺少参数:total_fee,支付失败
  • 原文地址:https://www.cnblogs.com/yan7/p/7799878.html
Copyright © 2011-2022 走看看