【ASP.NET】 Web Api (.NET 4.5)

在刚刚发布的 ASP.NET MVC 4 中,有一个值得注意的新特性——Web Api,微软官方的介绍是:

ASP.NET MVC 4 中包含了Web API 它能够构建HTTP服务以支撑更广泛的客户端,包括浏览器,手机和平板电脑的框架。
ASP.NET Web API是非常棒的构建服务的框架,遵循REST架构风格,而且它支持的RPC模式。


从 .NET 3.5 开始 WCF 已经支持用 WebHttpBinding 构建 RESTful Web 服务,基于 WCF 框架的 Web Api 还是建立在 WCF Message 栈上,因为 REST 的工作原理有所不同,它不需要依赖 SOAP 协议,因此 WCF 消息管道对于它经过了特殊的消息优化。但 REST 集成在 WCF 消息管道上还是不理想,所以微软提出在 ASP.NET 平台上构建REST服务,也就有了现在 ASP.NET MVC 4 中的 Web Api。

引用 WCF 在 Codeplex 上的声明:
Announcement: WCF Web API is now ASP.NET Web APIASP.NET Web API released with ASP.NET MVC 4 Beta.
The WCF Web API and WCF support for jQuery content on this site wll removed by the end of 2012.

 
如果对 REST WCF 框架熟悉的童鞋,可以参看下面的 WCF Web Api 到 ASP.NET Web Api 的映射表:

WCF Web APIASP.NET Web API
ServiceWeb API controller
OperationAction
Service contractNot applicable
EndpointNot applicable
URI templatesASP.NET Routing
Message handlersSame
FormattersSame
Operation handlersFilters, model binders

下面来看看如何使用 ASP.NET Web Api (使用的是 VS11 Beta 版)
(1) 创建 ASP.NET MVC 4 工程时选择 Web Api

创建出的工程中,Controllers 目录下会有一个 ValuesController.cs 注意它继承于 ApiController 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Web.Http;

namespace MvcApplication1.Controllers
{
    public class ValuesController : ApiController
    {
        // GET /api/values
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

        // GET /api/values/5
        public string Get(int id)
        {
            return "value";
        }

        // POST /api/values
        public void Post(string value)
        {
        }

        // PUT /api/values/5
        
        public void Put(int id, string value)
        {
        }

        // DELETE /api/values/5
        public void Delete(int id)
        {
        }
    }
}
在 Global.cs 中,注册了 Api 的 Url Map: api/{controller}/{id} 每个"Action"是通过 Http谓词(GET/POST/PUT/DELETE)映射的。
public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

(2) 增加一个自定义 Model
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MvcApplication1.Models
{
    public class Task
    {
        public string Id { get; set; }
        public string Title { get; set; }
        public string Content { get; set; }
        public int Status { get; set; }
    }
}

(3) 增加一个自定义 Repository

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using MvcApplication1.Models;

namespace MvcApplication1.Repositories
{
    public class TaskRepository
    {
        private List<Task> _tasks;

        public TaskRepository()
        {
            _tasks = new List<Task> { 
                new Task { Id="T001", Title="title1", Content="content1" },
                new Task { Id="T002", Title="title2", Content="content2" },
                new Task { Id="T003", Title="title3", Content="content3" },
                new Task { Id="T004", Title="title4", Content="content4" },
            };
        }

        public IEnumerable<Task> GetAll()
        {
            return _tasks;  
        }

        public Task FindById(string id)
        {
            return _tasks.FirstOrDefault(t => t.Id == id);
        }

        public void Add(Task task)
        {
            _tasks.Add(task);
        }

        public void RemoveById(string id)
        {
            var task = _tasks.FirstOrDefault(t => t.Id == id);
            if (task != null)
                _tasks.Remove(task);
        }
    }
}
(4) 增加 TaskController
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Web.Http;
using MvcApplication1.Models;

namespace MvcApplication1.Controllers
{
    public class TasksController : ApiController
    {
        private Repositories.TaskRepository _taskRepository = new Repositories.TaskRepository();

        // GET /api/tasks
        public IQueryable<Task> Get()
        {
            return _taskRepository.GetAll().AsQueryable();
        }

        // GET /api/tasks/5
        public Task Get(string id)
        {
            return _taskRepository.FindById(id);
        }

        // POST /api/tasks
        public void Post(Task task)
        {
            _taskRepository.Add(task);
        }

        // DELETE /api/tasks/5
        public void Delete(string id)
        {
            _taskRepository.RemoveById(id);
        }
    }
}
运行:


同样,客户端可以通过 Http Header 的 Accept 指定返回数据的格式。默认是支持:appliction/xml 和 application/json 
当想返回比如 image/jpeg 这样的图片格式时,需要添加 MediaTypeFormatter 

比如:当指定某个 Task 时,通过指定 Accept : image/jpeg 获取该 Task 的图片信息。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http.Formatting;
using System.Web;
using MvcApplication1.Models;

namespace MvcApplication1.Repositories
{
    public class TaskPictureFormatter : MediaTypeFormatter
    {
        protected override bool CanWriteType(Type type)
        {
            return (type == typeof(Task));
        }

        public TaskPictureFormatter()
        {
            SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("image/jpeg"));
        }

        protected override System.Threading.Tasks.Task OnWriteToStreamAsync(Type type, object value, 
                           System.IO.Stream stream, System.Net.Http.Headers.HttpContentHeaders contentHeaders, 
                           FormatterContext formatterContext, System.Net.TransportContext transportContext)
        {
            var task = value as Task;
            if (task != null)
            {
                var data = System.IO.File.ReadAllBytes(HttpContext.Current.Server.MapPath("~/TaskImages/" + task.Id + ".png"));
                return stream.WriteAsync(data, 0, data.Length);
            }
            else
            {
                throw new HttpException((int)System.Net.HttpStatusCode.NotFound, "task is not found", null);
            }
        }
    }
}
注意:当找不到对应的图片时,抛出 HttpException 这样可以给客户端更加友好的错误提示。


当输入一个错误的Id:


另外一个强大的功能是 Web Api 的 SelfHost,通过 HttpSelfHostServer 就可以非常方便的将 Web Api 寄宿到 IIS 以外的应用中去了。
作为简单数据交换的应用场景十分有用。

注意工程需要添加以下引用:
  • System.Net.Http
  • System.Web.Extensions
  • System.Web.Http
  • System.Web.Http.Common
  • System.Web.Http.SelfHost
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Http;
using System.Web.Http.SelfHost;

namespace WebApiSelfHostTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var config = new HttpSelfHostConfiguration("http://localhost:8080");

            config.Routes.MapHttpRoute(
                "API Default", "api/{controller}/{id}",
                new { id = RouteParameter.Optional });

            using (HttpSelfHostServer server = new HttpSelfHostServer(config))
            {
                server.OpenAsync().Wait();

                Console.WriteLine("HttpServer is opening, Press Enter to quit.");
                Console.ReadLine();
            }
        }
    }

    public class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public decimal Price { get; set; }
    }

    public class ProductsController : ApiController
    {
        public IEnumerable<Product> GetAllProducts()
        {
            return new List<Product> 
            {
                new Product() { Id = 1, Name = "Gizmo 1", Price = 1.99M },
                new Product() { Id = 2, Name = "Gizmo 2", Price = 2.99M },
                new Product() { Id = 3, Name = "Gizmo 3", Price = 3.99M }
            };
        }
    }
}


  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
### 回答1: ASP.NET Web API 是一个快速开发框架,用于构建用于Web应用程序的Web服务。它基于ASP.NET和HTTP协议,并充分利用了HTTP特性。 ASP.NET Web API 提供了一种简单明了的方式来创建和发布Web API,使开发人员能够轻松地将数据和服务暴露给客户端应用程序,无论是Web应用程序、移动应用程序还是其他类型的客户端。 ASP.NET Web API 提供了广泛的特性和功能,包括: 1. 灵活的路由配置:通过使用属性路由或传统的路由映射,开发人员可以轻松地定义API的URL结构和访问规则。 2. 内建HTTP支持:ASP.NET Web API完全支持HTTP协议,并提供了与HTTP相关的功能,如GET、POST、PUT、DELETE等HTTP动词和状态码处理。 3. 内容协商:ASP.NET Web API 可以根据客户端的要求,动态选择并返回不同的响应内容类型,如JSON、XML或其他自定义媒体类型。 4. 模型绑定和验证:ASP.NET Web API 提供了强大的模型绑定和验证功能,可以自动将请求数据绑定到相应的模型并进行验证。 5. 信息路由和版本控制:ASP.NET Web API 支持信息路由和版本控制,可以根据不同的请求信息选择不同的版本和实现。 6. 异常处理:ASP.NET Web API 提供了全面的异常处理机制,可以捕获和处理各种异常,并返回友好和有效的错误信息给客户端。 7. 安全性和身份验证:ASP.NET Web API 支持各种身份验证和安全性机制,如基于角色的授权、OAuth 2.0等。 总之,ASP.NET Web API 提供了一个高效、灵活和可扩展的框架,使开发人员能够快速构建和发布Web服务,并能适应不同类型的客户端应用程序。无论是构建企业级应用程序还是移动应用程序,ASP.NET Web API 都能够提供稳定可靠的解决方案。 ### 回答2: ASP.NET WebAPI是一种基于ASP.NET框架的快速开发框架。它主要用于构建和发布RESTful的Web服务,使开发者能够更快速地创建可扩展、可用性高的WebAPI应用程序。 首先,ASP.NET WebAPI提供了开箱即用的特性,使得开发者能够快速地创建基于HTTP协议的API。它支持多种数据格式,如JSON和XML,以及多个身份验证和授权方式,如基于角色和令牌的身份验证,使得开发者可以根据项目需求选择合适的方式来保护API。 其次,ASP.NET WebAPI提供了丰富的路由和绑定特性,使得开发者能够通过简单的配置和属性标记来定义API的路由规则和参数绑定方式。这种灵活性和可配置性使得开发者能够更轻松地处理不同的请求和响应,并提供符合预期的结果。 另外,ASP.NET WebAPI还提供了强大的行为和过滤器特性,例如认证过滤器、授权过滤器和异常过滤器等,使得开发者能够在不同阶段对请求进行处理和验证。同时,开发者还可以通过自定义过滤器来扩展现有特性或添加新的行为和过滤器。 此外,ASP.NET WebAPI还提供了易于测试和部署的特性。开发者可以使用单元测试框架对API进行测试,并通过ASP.NET的集成测试工具进行端到端的测试。同时,ASP.NET WebAPI还支持自托管和IIS托管两种部署方式,使得开发者能够更方便地部署和维护API应用程序。 综上所述,ASP.NET WebAPI是一个功能强大、易于使用和高效的快速开发框架。它提供了丰富的特性和可扩展性,使开发者能够更快速地构建和发布高质量的WebAPI应用程序。 ### 回答3: ASP.NET Web API 是一个用于构建基于HTTP协议的Web服务的框架,它可以让开发人员更快速、更高效地开发Web应用程序。 首先,ASP.NET Web API 提供了快速创建和部署Web服务的能力。通过使用ASP.NET Web API,开发人员可以轻松地创建RESTful风格的API,并将其部署到云端或本地服务器上。与传统的ASP.NET MVC相比,ASP.NET Web API 提供了更简洁、更轻量级的开发体验,让开发人员可以更专注于服务端逻辑的编写。 其次,ASP.NET Web API 提供了丰富的功能和工具,帮助开发人员更快速地构建和调试Web服务。它支持多种数据格式,包括JSON和XML,提供了强大的序列化和反序列化功能,可以轻松地处理来自客户端的请求和响应数据。此外,ASP.NET Web API 还支持组织代码的特性,如路由、过滤器和模型绑定等,让开发人员可以更轻松地组织和管理代码。 最后,ASP.NET Web API 具有良好的可扩展性和灵活性。它可以很容易地和其他ASP.NET 项目集成,如ASP.NET MVC和ASP.NET Core等。开发人员可以利用现有的ASP.NET技术和工具来开发和扩展Web API,并利用ASP.NET的生态系统来提供更丰富的功能和支持。 总之,ASP.NET Web API 是一个快速开发框架,它提供了方便、高效的开发体验,让开发人员可以更快速地构建和部署基于HTTP协议的Web服务。无论是构建RESTful风格的API,还是处理来自客户端的请求和响应数据,ASP.NET Web API 都是一个强大的工具和框架。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值