返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, .net 4.5 带来的更方便的异步操作
作者:webabcd
介绍
asp.net mvc 之 asp.net mvc 4.0 新特性之 Web API
- 自宿主 web api
- 宿主到 iis,通过 WebForm 提供 web api 服务
- 通过 Web API 上传文件
- .net 4.5 带来的更方便的异步操作
示例
1、自宿主 Web API 的 demo
WebApiSelfHost/Program.cs
/*
* 自宿主 web api 的 demo
*
* 测试地址:http://localhost:123/api/hello
*/ using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Web.Http;
using System.Web.Http.SelfHost; namespace WebApiSelfHost
{
// web api
public class HelloController : ApiController
{
public string Get()
{
return "hello: webabcd";
}
} class Program
{
static readonly Uri _baseAddress = new Uri("http://localhost:123/"); static void Main(string[] args)
{
HttpSelfHostServer server = null;
try
{
// 配置一个自宿主 http 服务
HttpSelfHostConfiguration config = new HttpSelfHostConfiguration(_baseAddress); // 配置 http 服务的路由
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
); // 创建 http 服务
server = new HttpSelfHostServer(config); // 开始监听
server.OpenAsync().Wait();
// 停止监听
// server.CloseAsync().Wait(); Console.WriteLine("Listening on " + _baseAddress);
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
Console.ReadLine();
}
}
}
}
2、演示如何在 WebForm 中提供 web api 服务
Global.asax.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Routing;
using System.Web.Security;
using System.Web.SessionState;
using System.Web.Http; namespace WebApiWebFormHost
{
public class Global : System.Web.HttpApplication
{
protected void Application_Start(object sender, EventArgs e)
{
// 配置路由
RouteTable.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
}
HelloController.cs
/*
* 宿主到 iis,通过 WebForm 提供 web api 服务
*
* 测试地址:http://localhost:4723/api/hello
*/ using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http; namespace WebApiWebFormHost
{
public class HelloController : ApiController
{
public IEnumerable<string> Get()
{
string[] names = { "webabcd", "webabcd2", "webabcd3" };
return names;
}
}
}
3、演示如何通过 web api 上传文件
WebApiWebFormHost/UploadFileController.cs
/*
* 通过 web api 上传文件
*/ using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web.Http; namespace MVC40.Controllers
{
public class UploadFileController : ApiController
{
public async Task<string> Post()
{
// 检查是否是 multipart/form-data
if (!Request.Content.IsMimeMultipartContent("form-data"))
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); // 设置上传目录
var provider = new MultipartFormDataStreamProvider(@"c:\\temp"); // 接收数据,并保存文件
var bodyparts = await Request.Content.ReadAsMultipartAsync(provider); string result = "";
// 获取表单数据
result += "formData txtName: " + bodyparts.FormData["txtName"];
result += "<br />"; // 获取文件数据
result += "fileData headers: " + bodyparts.FileData[].Headers; // 上传文件相关的头信息
result += "<br />";
result += "fileData localFileName: " + bodyparts.FileData[].LocalFileName; // 文件在服务端的保存地址,需要的话自行 rename 或 move return result;
}
}
}
WebApiWebFormHost/UploadDemo.cshtml
@{
Layout = null;
} <!DOCTYPE html> <html>
<head>
<title>调用 web api 上传文件的 demo</title>
</head>
<body>
@using (Html.BeginForm("UploadFile", "api", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
<input type="text" id="txtName" name="txtName" value="webabcd" />
<div>please select a file</div>
<input name="data" type="file" multiple />
<input type="submit" />
}
</body>
</html>
4、.net 4.5 带来的更方便的异步操作
AsyncController.cs
/*
* 演示如何利用 .net 4.5 的新特性实现异步操作
*
* 什么场景下需要异步操作?
* 在因为磁盘io或网络io而导致的任务执行时间长的时候应该使用异步操作,如果任务执行时间长是因为cpu的消耗则应使用同步操作(此时异步操作不会改善任何问题)
* 原理是什么?
* 在 Web 服务器上,.NET Framework 维护一个用于服务 ASP.NET 请求的线程池(以下把 .NET Framework 维护的用于服务 ASP.NET 请求的线程池称作为“特定线程池”)
* 同步操作时,如果特定线程池利用满了,则不会再提供服务
* 异步操作时:
* 1、一个请求过来,特定线程池出一个线程处理此请求
* 2、启动一个非特定线程池中的另一个线程处理异步操作,此时处理此请求的线程就会空出来,不会被阻塞,它可以继续处理其它请求
* 3、异步操作执行完毕后,从特定线程池中随便找一个空闲线程返回请求结果
*/ using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web.Http; namespace MVC40.Controllers
{
public class AsyncController : ApiController
{
public async Task<string> Get()
{
return await GetData();
} [NonAction]
public async Task<string> GetData()
{
await Task.Delay( * ); return "长时间的任务执行完毕";
}
}
}
OK
[源码下载]
返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, .net 4.5 带来的更方便的异步操作的更多相关文章
- ASP.NET MVC中使用表单上传文件时的注意事项
最近了好久没写ASP.NET 使用HTML的FORM来上传文件了,结果写了个文件上传发现ASP.NET MVC的Controller中老是读取不到上传的文件. MVC的View(Index.cshtm ...
- asp.net 限制上传文件的大小与时间
在web.Config文件中配置限制上传文件大小与时间的字符串是在<httpRuntime><httpRuntime/>节中完成. maxRequsetLength 属性:用于 ...
- 返璞归真 asp.net mvc (12) - asp.net mvc 4.0 新特性之移动特性
原文:返璞归真 asp.net mvc (12) - asp.net mvc 4.0 新特性之移动特性 [索引页][源码下载] 返璞归真 asp.net mvc (12) - asp.net mvc ...
- 返璞归真 asp.net mvc (6) - asp.net mvc 2.0 新特性
原文:返璞归真 asp.net mvc (6) - asp.net mvc 2.0 新特性 [索引页][源码下载] 返璞归真 asp.net mvc (6) - asp.net mvc 2.0 新特性 ...
- 返璞归真 asp.net mvc (13) - asp.net mvc 5.0 新特性
[索引页][源码下载] 返璞归真 asp.net mvc (13) - asp.net mvc 5.0 新特性 作者:webabcd 介绍asp.net mvc 之 asp.net mvc 5.0 新 ...
- 返璞归真 asp.net mvc (7) - asp.net mvc 3.0 新特性之 Controller
原文:返璞归真 asp.net mvc (7) - asp.net mvc 3.0 新特性之 Controller [索引页][源码下载] 返璞归真 asp.net mvc (7) - asp.net ...
- 返璞归真 asp.net mvc (8) - asp.net mvc 3.0 新特性之 Model
原文:返璞归真 asp.net mvc (8) - asp.net mvc 3.0 新特性之 Model [索引页][源码下载] 返璞归真 asp.net mvc (8) - asp.net mvc ...
- 返璞归真 asp.net mvc (9) - asp.net mvc 3.0 新特性之 View(Razor)
原文:返璞归真 asp.net mvc (9) - asp.net mvc 3.0 新特性之 View(Razor) [索引页][源码下载] 返璞归真 asp.net mvc (9) - asp.ne ...
- 返璞归真 asp.net mvc (10) - asp.net mvc 4.0 新特性之 Web API
原文:返璞归真 asp.net mvc (10) - asp.net mvc 4.0 新特性之 Web API [索引页][源码下载] 返璞归真 asp.net mvc (10) - asp.net ...
随机推荐
- 基于TFTP协议的远程升级设计
说明:因为CSDN博客编辑器对word格式近乎不支持.因此对表格使用了图片方式(最后一个表格未使用图片格式.大家能够看看效果),CSDN博客编辑器上传图片十分不人性化(直接复制图片是不显示的),因此本 ...
- OC -- 第一个类
OC -- 第一个类 类名:Car 属性:轮胎个数.时速 行为:跑 完整写一个类:类的声明和实现 1. 类的声明 代码: // NSObject 再Foundation框架中 #import & ...
- Factorization Machines 学习笔记(四)学习算法
近期学习了一种叫做 Factorization Machines(简称 FM)的算法.它可对随意的实值向量进行预測.其主要长处包含: 1) 可用于高度稀疏数据场景:2) 具有线性的计算复杂度.本文 ...
- OpenCV-Python教程(9、使用霍夫变换检测直线)
相比C++而言,Python适合做原型.本系列的文章介绍如何在Python中用OpenCV图形库,以及与C++调用相应OpenCV函数的不同之处.这篇文章介绍在Python中使用OpenCV的霍夫变换 ...
- 深入理解Tomcat系列之一:系统架构(转)
前言 Tomcat是Apache基金组织下的开源项目,性质是一个Web服务器.下面这种情况很普遍:在eclipse床架一个web项目并部署到Tomcat中,启动tomcat,在浏览器中输入一个类似ht ...
- LeetCode :: Binary Tree Zigzag Level Order Traversal [tree, BFS]
Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...
- Ajax改动购物车
1.购物车类的设计 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hpeWVxaWFuZ2xkaA==/font/5a6L5L2T/fontsize/4 ...
- ubuntu Linux 安装和首次使用
1.ubuntu Linux 安装后切换到root账户,在默认情况下,系统安装过程中需要创建一个用户,切换到root账号命令如下:$ sudo -s -H输入 当前账户密码就可以切换到root.2.u ...
- OpenCL 查看设备信息
好久没搞OpenCL了.可是这是个好东西.不能不学,之前发了篇设置OpenCL的文章.看的人还真多,看来大家都知道这个好东西了,都想把OpenCL搞起.只是学习难度还是相当高的. 之前忙搞算法,所以非 ...
- ORACLE 实验二
实验二:数据操纵 实验学时:4学时 实验类型:综合型 实验要求:必修 一.实验目的 1.掌握SQL数据查询语句: 2.掌握SQL聚集函数的使用. 3.掌握SQL插入.改动.删除语句的使用. 二.实验内 ...