【转载】返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件,...

介绍 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[0].Headers; // 上传文件相关的头信息
            result += "<br />";
            result += "fileData localFileName: " + bodyparts.FileData[0].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(10 * 1000);

            return "长时间的任务执行完毕";
        }
    }
}
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自由宿主后台管理系统是一套通用后台管理系统,之所以给他加上“宿主”2个字,是因为这套系统本身没有自己的数据库,而必须依赖于其他数据库才能运行,自由指的是系统灵活性强,能够根据数据库表结构做一些简单的配置后系统就能够实现想要的功能。简单的说,就是系统没有根据特定的数据库来设计,你给他套上什么结构的数据库表,他就做什么样的事情。 自由宿主Asp.net网站通用后台管理系统特点如下: 1. 后台本身没有数据库,自己设计数据库后,与后台连接,配置好节点后无需二次开发,直接就可以实现对数据库增删改查功能; 2. 后台密码支持自定义加密/解密算法,可以在设置登录表的时候进行配置; 3. 后台编辑界面可以根据配置自动生成编辑器,同时会自动生成验证脚本; 4. 后台支持多表关联,列表查询时候会自动根据关联字段显示相应内容; 5. 兼容IE6+,火狐浏览器等主流浏览器; 6. 对数据库表的操作,如增删改查操作只需要进行简单的设置即可完成,无需再进行任何编码实现。 自由宿主Asp.net网站通用后台管理系统3.1正式版更新功能: 1. 修正首次登录页面设置登录表后出现404错误页面的问题; 2. 增加菜单权限控制,可以设置菜单是否有增删改功能; 数据库升级方式请参见 http://www.tzhtec.com/art/6f456394186.aspx 自由宿主Asp.net网站通用后台管理系统3.0正式版更新功能: 1. 调整列表和编辑界面样式,列表修改为采用easyui的grid显示; 2. 编辑页面日期、编辑器和验证脚本整理,调整到脚本文件edit.js,如果有其他需求,可以修改该脚本文件; 3. 增加oracle和mysql数据库支持,支持,系统可以支持ms sql、access、oracle和mysql等主流数据库; 4. 由于原来的jquery.ui在系统上使用并不多,在本次改版后去除了jquery.ui,css和js上有大量瘦身; 5. 登陆后主页显示的default.aspx页面修改允许用户自行修改设置; 6. 系统对平台要求提升,最低运行环境为framework3.5,不再对framework2.0进行支持; 7. 对SQL查询语句做了优化; 8. 系统架构重新调整;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值