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 Allen和Tim McCall(因attributerouting.net而闻名)开发贡献:
CORS 支持ASP.NET Web API
跨域资源共享(CORS)是一种W3C标准,它允许网页对一个不同的的网域发送AJAX请求。本标准放宽了在Web浏览器中实施的同源政策(它限制了对某域的资源的访问权限)。 CORS规范定义了如何在浏览器和服务器之间交互来进行跨域访问。
下面的图像显示的ASP.NET Web API测试工具(运行在https://xyz123.azurewebsites.net/)对Contoso域进行跨域访问。当你按一下发送,一个跨域请求就会被生成。因为Contoso公司的网站配置不支持CORS,就会弹出一个错误对话框中。
CORS错误在IE F12工具-Console选项卡下可以看到。
出于安全考虑,Web浏览器不允许azure站点访问Contoso域。而Contoso.com通过新的ASP.NET Web API CORS框架,可配置发送正确的CORS头文件,这样浏览器会接受跨域访问。
MVP Brock Allen将他的CORS资源贡献到ASP.NET Webstack库。Block曾与Yao Huang Lin(ASP.NET团队的开发人员)共事,完善和迭代该设计,并把它拉进Webstack库。Brock Allen,Dan Roth及Yao在这个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