ASP.NET Web API: CORS支持和基于属性的路由改进

[原文发表地址] ASP.NET Web API: CORS support and Attribute Based Routing Improvements

[原文发表时间] 2013-4-19, 11:37 AM

自从ASP.NET Web API发布最初版本以来,我们已经看到了它被大量采用。在2月份我们发布了ASP.NET和Web工具2012.2更新 - 添加了一些额外的Web API及ASP.NET的其他组成部分的功能增强。

ASP.NET开发团队一直致力于开发下一代的功能集(很多很酷的东西来了)。这项工作的重大事情之一是团队如何使用了开源开发过程我们去年春天宣布采用的)来与社区更加紧密的合作,尽早验证功能,以及使社区开发人员直接促进它们的开发。

下面是ASP.NET Web API两大强大功能的一些更新 – 由ASP.NET MVP Brock AllenTim McCall(因attributerouting.net而闻名)开发贡献:

CORS 支持ASP.NET Web API

跨域资源共享(CORS)是一种W3C标准,它允许网页对一个不同的的网域发送AJAX请求。本标准放宽了在Web浏览器中实施的同源政策(它限制了对某域的资源的访问权限)。 CORS规范定义了如何在浏览器和服务器之间交互来进行跨域访问。

下面的图像显示的ASP.NET Web API测试工具(运行在https://xyz123.azurewebsites.net/)对Contoso域进行跨域访问。当你按一下发送,一个跨域请求就会被生成。因为Contoso公司的网站配置不支持CORS,就会弹出一个错误对话框中。

clip_image002[4]

CORS错误在IE F12工具-Console选项卡下可以看到。

clip_image004[4]

出于安全考虑,Web浏览器不允许azure站点访问Contoso域。而Contoso.com通过新的ASP.NET Web API CORS框架,可配置发送正确的CORS头文件,这样浏览器会接受跨域访问。

clip_image005[4]

MVP Brock Allen将他的CORS资源贡献到ASP.NET Webstack库。Block曾与Yao Huang Lin(ASP.NET团队的开发人员)共事,完善和迭代该设计,并把它拉进Webstack库。Brock AllenDan RothYao这个Channel 9 视频中就Brock的CORS贡献进行了探讨。

CORS支持ASP.NET Web API页面展示了如何开始使用这个新功能。

ASP.NET WebAPI上基于属性的路由

最近我们在ASP.NET Web API的发展蓝图上发表了我们的打算,支持在ASP.NET Web API基于属性的路由。路由属性使URL定义更接近针对特定的URL运行的代码,更容易了解哪个URL是特定的代码块必须访问的,并简化了许多常见的路由方案。

例如,假设你想要定义一个Web API,拥有一套标准的HTTP操作(GET,POST,PUT,DELETE,等等),但同时你也想有一个额外的自定义操作,如批准。您就可以直接为该操作定义属性,而不需要为Approve操作在全局路由表添加另一个路由:

 public class OrdersController : ApiController

{ 

public IEnumerable<Order> GetOrders() {…} 

public Order GetOrder(int id) {…} 

public Order Post(Order order) {…}

[HttpPost("orders/{id}/approve")] 

public Order Approve(int id) {…} 

}

扩展路由的模板语法使指定默认值和约束路由值变得非常简单。例如,你现在可以轻松地创建两个动作,基于参数类型被调用。在下面的PeopleController中,GetByID操作的参数id只需int值。GetByName操作方法包含一个默认名称“Nick”。

 public class PeopleController : ApiController

{ 

[HttpGet("{name=Nick}")] 

public string GetByName(string name) {…} 

[HttpGet("{id:int}")] 

public string GetById(int id) {…} 

}

您还可以为您的Web API定义常用的路由前缀。例如,您可以使用路由前缀设立一个资源分层结构:

 [RoutePrefix("movies")] 

[RoutePrefix("actors/{actorId}/movies")] 

[RoutePrefix("directors/{directorId}/movies")] 

public class MoviesController : ApiController

{ 

public IEnumerable<Movie> GetMovies() {…} 

public IEnumerable<Movie> GetMoviesByActor(int actorId) {…} 

public IEnumerable<Movie> GetMoviesByDirector(int directorId) {…} 

}

或者,您可以使用路由前缀来处理你的Web API的多个版本:

 [RoutePrefix("api/v1/customers")] 

public class CustomersV1Controller : ApiController {…} 

[RoutePrefix("api/v2/customers")] 

public class CustomersV2Controller : ApiController {…}

和新CORS支持ASP.NET Web API一样,基于属性的路由支持主要是来自社区的贡献。我们正和attributerouting.net专家Tim McCall密切合作,将他AttributeRouting项目的很多功能直接引用到ASP.NET Web API中。

能看到整个ASP.NET团队和社区间的合作帮助推动了ASP.NET平台的发展,这真是令人兴奋!

希望对您有所帮助,

Scott

P.S.除了博客,我现也用 Twitter以便更快地更新、分享链接。请关注我: @scottgu