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 = , Name = "Tomato Soup", Category = "Groceries", Price = });
products.Add(new Product { Id = , Name = "Yo-yo", Category = "Toys", Price = 3.75M });
products.Add(new Product { Id = , 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派生插入自定义消息处理程序中
Asp.Net Web API(六)的更多相关文章
- Asp.Net Web API 2第十六课——Parameter Binding in ASP.NET Web API(参数绑定)
导航 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html. 本文主要来讲解以下内容: ...
- Asp.Net Web API 2第六课——Web API路由和动作选择
Asp.Net Web API 导航 Asp.Net Web API第一课——入门http://www.cnblogs.com/aehyok/p/3432158.html Asp.Net Web AP ...
- 在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用
由于ASP.NET Web API具有与ASP.NET MVC类似的编程方式,再加上目前市面上专门介绍ASP.NET Web API 的书籍少之又少(我们看到的相关内容往往是某本介绍ASP.NET M ...
- ASP.NET Web API路由系统:路由系统的几个核心类型
虽然ASP.NET Web API框架采用与ASP.NET MVC框架类似的管道式设计,但是ASP.NET Web API管道的核心部分(定义在程序集System.Web.Http.dll中)已经移除 ...
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【开篇】【持续更新中。。。】
最近发现web api很火,园内也有各种大神已经在研究,本人在asp.net官网上看到一个系列教程,原文地址:http://bitoftech.net/2013/11/25/detailed-tuto ...
- ASP.NET Web API 学习【转】
转自:http://www.cnblogs.com/babycool/p/3922738.html 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用J ...
- 【转】ASP.NET WEB API系列教程
from: 西瓜小强 http://www.cnblogs.com/risk/category/406988.html ASP.NET Web API教程(六) 安全与身份认证 摘要: 在实际的项目应 ...
- 使用ASP.NET web API创建REST服务(二)
Creating a REST service using ASP.NET Web API A service that is created based upon the architecture ...
- 一个ASP.NET Web API 2.0应用
在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用 由于ASP.NET Web API具有与ASP.NET MVC类似的编程方式,再加上目前市面上专门介绍ASP.N ...
随机推荐
- linux操作系统基础篇(九)
shell脚本的运算符与流程控制 1.运算符 1.1 算术运算符 + - * / % [root@MiWiFi-R3-srv ~]# echo $[3+1]4 1.2 关系操作 与(())连用 < ...
- 【JDK1.8】JDK1.8集合源码阅读——TreeMap(一)
一.前言 在前面两篇随笔中,我们提到过,当HashMap的桶过大的时候,会自动将链表转化成红黑树结构,当时一笔带过,因为我们将留在本章中,针对TreeMap进行详细的了解. 二.TreeMap的继承关 ...
- AIO5物料清单(BOM)列表,搜索编码和名称无效
问题: AIO5物料清单(BOM)列表,搜索编码和名称无效.如图: 原因分析 AIO5的BOM是在二次开发平台上做的,在制作自定义单据的时候[查询参数设置]没有设置.如下图: 解决方案 工具:AIO5 ...
- 快速拥有各种数据访问SqlHelper
常加班食不按时,偶得清闲嘴溃疡. 美食一顿成泡汤,自此自认忙命人. 这就是此情此景的我,回来聊代码. 列举ADO.NET中的五个主要对象,并简单描述? 答:Connection连接对象,Command ...
- 从实战出发,谈谈 nginx 信号集
前言 之前工作时候,一台引流测试机器的一个 ngx_lua 服务突然出现了一些 HTTP/500 响应,从错误日志打印的堆栈来看,是不久前新发布的版本里添加的一个 Lua table 不存在,而有代码 ...
- 学习MySQL(上)
具体实例 1.PHP 服务器组件 对于初学者建议使用集成的服务器组件,它已经包含了 PHP.Apache.Mysql 等服务,免去了开发人员将时间花费在繁琐的配置环境过程. Window 系统可以使用 ...
- Windows下载安装Numpy、Scipy、py-matplotlib
一.安装环境 Windows10 64.python2.7 二.Numpy下载 1.下载Numpy: 下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/# ...
- nginx+tomcat安装配置
nginx+tomcat安装配置 # nginx+tomcat安装配置 #创建网站目录 mkdir -p /www/wwwroot cd /www #安装配置 wget http://mirrors. ...
- Mysql实现企业级日志管理、备份与恢复实战
背景 随着业务的发展,公司业务和规模不断扩大,网站积累了大量的用户信息和数据,对于一家互联网公司来说,用户和业务数据是根基.一旦公司的数据错乱或者丢失,对于互联网公司而言就等于说是灭顶之灾,为防止系统 ...
- React Native学习——动画Animated(笔记)
很多地方都需要用到动画,先看下文档吧. 一.两个互补的动画系统 LayoutAnimation:用于全局的布局动画 Animated:用于创建更精细的交互控制的动画(主要是这个) 二.Animated ...