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=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);

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏salesforce零基础学习

salesforce 零基础学习(三十三)通过REST方式访问外部数据以及JAVA通过rest方式访问salesforce

本篇参考Trail教程: https://developer.salesforce.com/trailhead/force_com_dev_intermedia...

5798
来自专栏Porschev[钟慰]的专栏

Asp.Net开发等级星使用(Jquery Rating)

插件参数: rater第一个参数是AJAX提交的URL rater第二个参数 maxvalue:最大星数 curvalue:默认选择多少颗星 title:鼠标放...

2317
来自专栏丑胖侠

《Drools7.0.0.Final规则引擎教程》第4章 4.3 日历

日历 日历可以单独应用于规则中,也可以和timer结合使用在规则中使用。通过属性calendars来定义日历。如果是多个日历,则不同日历之间用逗号进行分割。 在...

26710
来自专栏跟着阿笨一起玩NET

DataTable.Select 返回DataTable

在实际编程工程中,常常遇到这样的情况:DataTable并不是数据库中的,或者DataTable尚未写到数据库,或者从数据库中读出的DataTable已经在本地...

891
来自专栏Java成神之路

极光推送_总结_01_Java实现极光推送

1313
来自专栏菩提树下的杨过

利用fluorineFx将DataTable从.Net传递到Flash

FluorineFx自带的示例都不错,就是有点不简洁,下面的代码基本上已经最简版了(环境vs2010) 1、先创建一个Web Application,然后添加F...

2385
来自专栏恰同学骚年

ASP.Net请求处理机制初步探索之旅 - Part 2 核心

开篇:上一篇我们了解了一个请求从客户端发出到服务端接收并转到ASP.Net处理入口的过程,这篇我们开始探索ASP.Net的核心处理部分,借助强大的反编译工具,我...

892
来自专栏跟着阿笨一起玩NET

ASP.NET多线程下使用HttpContext.Current为null解决方案

前面我还提到在APM模式下的异步完成回调时,访问HttpContext.Current也会返回null,那么此时该怎么办呢?

1582
来自专栏张善友的专栏

使用MongoDB的支持Linq 驱动NoRM

MongoDB的驱动有好几个,分布式文件存储的数据库开源项目MongoDB里使用的是github.com/samus/mongodb-csharp,monogo...

21410
来自专栏菩提树下的杨过

C#:Func的同步、异步调用

实际开发中,对于一些耗时较长的操作,我们往往会将其封装成异步方式调用,以加速系统响应或改善用户体验,下面是一个示例: 有一个现成的类MyMath,里面有一个Ad...

2676

扫码关注云+社区

领取腾讯云代金券