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 ...
随机推荐
- [转载] Hadoop和Hive单机环境搭建
转载自http://blog.csdn.net/yfkiss/article/details/7715476和http://blog.csdn.net/yfkiss/article/details/7 ...
- Caused by: org.xml.sax.SAXParseException; lineNumber: 4; columnNumber: 49; 前言中不允许有内容。
今天刚开始学习mybatis时,自己去尝试使用mybatis链接数据库,操作数据局时,报了一个下面的错误 Caused by: org.xml.sax.SAXParseException; lineN ...
- 激光相机数据融合(4)--KITTI数据集中matlab接口说明及扩展
KITTI数据集接口已经提供了matlab接口,本篇将说明详细说明其应用并与PCL进行对接.PCL为C++点云处理语言库,详情可见:http://pointclouds.org/ 程序可以从官网下载, ...
- 分布式网络文件系统--MooseFS
一.介绍 1.简介 MooseFS是一个具备冗余容错功能的分布式网络文件系统,它将数据分别存放在多个物理服务器或单独磁盘或分区上,确保一份数据有多个备份副本.对于访问的客户端或者用户来说,整个分布式网 ...
- js从时间戳中获取日期
1,从时间戳中解析出年月日时分秒: time为时间戳: var timestr = new Date(parseInt(time) * 1000); var year = timestr.getFul ...
- 【Java入门提高篇】Day1 抽象类
基础部分内容差不多讲解完了,今天开始进入Java提高篇部分,这部分内容会比之前的内容复杂很多,希望大家做好心理准备,看不懂的部分可以多看两遍,仍不理解的部分那一定是我讲的不够生动,记得留言提醒我. 好 ...
- 【Java框架型项目从入门到装逼】第二节 - Spring框架 AOP的丧心病狂解说,你喜欢露娜的月下无限连吗?
继续上一节的内容,多几个jar包: aop技术是面向切面编程思想,作为OOP的延续思想添加到企业开发中,用于弥补OOP开发过程中的缺陷而提出的编程思想.AOP底层也是面向对象:只不过面向的不是普通的O ...
- 在没有DOM操作的日子里,我是怎么熬过来的(上)
前言 在我动笔写这篇文章的时候,我刚刚从我的项目中删除了最后一行JQuery代码.至于我为何要这么做,请听闰土娓娓道来.前几年我还在想,假如有一天,前端世界里不能再直接操作dom了,我该怎么办?没想到 ...
- 《java.util.concurrent 包源码阅读》04 ConcurrentMap
Java集合框架中的Map类型的数据结构是非线程安全,在多线程环境中使用时需要手动进行线程同步.因此在java.util.concurrent包中提供了一个线程安全版本的Map类型数据结构:Concu ...
- 关于控制台输出 警告 log4j:WARN No appenders could be found for logger
新建struts2项目时出现警告 log4j:WARN No appenders could be found for logger 于是上网搜查了解决方案 转自:最爱NBA 在src下面新建file ...