返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, .net 4.5 带来的更方便的异步操作

简介: 原文:返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, .
原文: 返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, .net 4.5 带来的更方便的异步操作

[索引页]
[源码下载]


返璞归真 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[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 "长时间的任务执行完毕";
        }
    }
}



OK
[源码下载]

目录
相关文章
|
2月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
60 4
|
4月前
|
安全 Java API
告别繁琐编码,拥抱Java 8新特性:Stream API与Optional类助你高效编程,成就卓越开发者!
【8月更文挑战第29天】Java 8为开发者引入了多项新特性,其中Stream API和Optional类尤其值得关注。Stream API对集合操作进行了高级抽象,支持声明式的数据处理,避免了显式循环代码的编写;而Optional类则作为非空值的容器,有效减少了空指针异常的风险。通过几个实战示例,我们展示了如何利用Stream API进行过滤与转换操作,以及如何借助Optional类安全地处理可能为null的数据,从而使代码更加简洁和健壮。
131 0
|
25天前
|
存储 Java 数据挖掘
Java 8 新特性之 Stream API:函数式编程风格的数据处理范式
Java 8 引入的 Stream API 提供了一种新的数据处理方式,支持函数式编程风格,能够高效、简洁地处理集合数据,实现过滤、映射、聚合等操作。
41 6
|
2月前
|
缓存 JavaScript 前端开发
深入理解 Vue 3 的 Composition API 与新特性
本文详细探讨了 Vue 3 中的 Composition API,包括 setup 函数的使用、响应式数据管理(ref、reactive、toRefs 和 toRef)、侦听器(watch 和 watchEffect)以及计算属性(computed)。我们还介绍了自定义 Hooks 的创建与使用,分析了 Vue 2 与 Vue 3 在响应式系统上的重要区别,并概述了组件生命周期钩子、Fragments、Teleport 和 Suspense 等新特性。通过这些内容,读者将能更深入地理解 Vue 3 的设计理念及其在构建现代前端应用中的优势。
47 1
深入理解 Vue 3 的 Composition API 与新特性
|
1月前
|
JavaScript 前端开发 API
Vue 3新特性详解:Composition API的威力
【10月更文挑战第25天】Vue 3 引入的 Composition API 是一组用于组织和复用组件逻辑的新 API。相比 Options API,它提供了更灵活的结构,便于逻辑复用和代码组织,特别适合复杂组件。本文将探讨 Composition API 的优势,并通过示例代码展示其基本用法,帮助开发者更好地理解和应用这一强大工具。
36 2
|
3月前
|
存储 JavaScript 前端开发
敲黑板!vue3重点!一文了解Composition API新特性:ref、toRef、toRefs
该文章深入探讨了Vue3中Composition API的关键特性,包括`ref`、`toRef`、`toRefs`的使用方法与场景,以及它们如何帮助开发者更好地管理组件状态和促进逻辑复用。
敲黑板!vue3重点!一文了解Composition API新特性:ref、toRef、toRefs
|
3月前
|
Java 程序员 API
Java 8新特性之Lambda表达式与Stream API的探索
【9月更文挑战第24天】本文将深入浅出地介绍Java 8中的重要新特性——Lambda表达式和Stream API,通过实例解析其语法、用法及背后的设计哲学。我们将一探究竟,看看这些新特性如何让Java代码变得更加简洁、易读且富有表现力,同时提升程序的性能和开发效率。
|
2月前
|
API C#
异步轮询 Web API 的实现与 C# 示例
异步轮询 Web API 的实现与 C# 示例
90 0
|
4月前
|
Java API
Java 8新特性:Lambda表达式与Stream API的深度解析
【7月更文挑战第61天】本文将深入探讨Java 8中的两个重要特性:Lambda表达式和Stream API。我们将首先介绍Lambda表达式的基本概念和语法,然后详细解析Stream API的使用和优势。最后,我们将通过实例代码演示如何结合使用Lambda表达式和Stream API,以提高Java编程的效率和可读性。
|
4月前
|
前端开发 JavaScript API
Vue 3 新特性:在 Composition API 中使用 CSS Modules
Vue 3 新特性:在 Composition API 中使用 CSS Modules