微小的开心功能第2部分-Visual Studio 2012 中的ASP.NET Web API
[原文发表地址] Tiny Happy Features #2 - ASP.NET Web API in Visual Studio 2012
[原文发表时间] 2012-08-10 23:55
很快就会有很多人开始编写有关 Visual Studio 2012的史诗般的博客文章。它们将包括大量的截图 (一些好的和一些差的),一些小的代码示例和极少的文本。我不能代表其他的团队 ;我只能讨论我们所做的工作。Azure 平台和工具(ASP.NET,IIS,WCF、 EF、Azure和更多)中的尖括号家伙们(我对网络平台和工具团队的称呼)已投入了大量的工作到我有时称之为"一千个微小伤亡"中。小小的眼中钉会如同大的缺失功能一样(或更加)令人沮丧。
我不想长篇大论(虽然我有时会这样做),我会展示一些团队致力于的微小的开心功能, 正是这些微小的功能让生活变得更加美好。有些是大功能的,有些是小的,但它们都是微小的开心功能。
有的企业 Web 服务使用 SOAP 和 WS-*.*它们对许多事务性或复杂的方案来说很不错。然后还有更轻量级的RESTful web 服务或"Web API",它们使用 JSON,XML,展示了所有的好东西和HTTP 规范的稳定性。
WCF 过得好好的, ASP.NET 也如此,每种技术都有使用其的理由。正如这篇文章说得好, "SOAP的世界与HTTP 服务的世界是完全不同的。SOAP 允许我们将我们的服务所需的所有知识放在信息本身中",而"您可以使用 [Web API] 来创建只使用标准HTTP 概念 (URI 和动词)的HTTP服务,和创建使用更高级的 HTTP功能的服务 — — 请求/响应标头,超媒体概念等。
Kelly Sommers在澄清REST中撰写了我认为是REST的最好诠释,无论你想编写 RESTful专注于资源的 HTTP 服务还是只是POX或 POJ (Plain Old XML 或Plain Old JSON) 服务,你能使用ASP.NET Web API做到这两点。它是ASP.NET 开放源web 栈的所有部分。
ASP.NET API Web
在此 Git 存储库中有一些可爱的新示例。只需"git clone https://git01.codeplex.com/aspnet" ,或下载 zip。你还可以在新的https://www.asp.net/webapi网站上自己熟悉 ASP.NET 和Web API。
顺便说一句,我将在下周的15日发布一堆 (13 !)新的视频,它们会展示 Web API 以及很多其他微小的开心功能,每个视频只有 5 分钟长,这将是午餐时间加快使用所有新技术的好方法。
若要使用示例,请遵循Henrik的博客帖子上的说明。
这里有一个很好的小示例,也许它将会让你重新考虑你可以使用ASP.NET web 技术所能实现的任务。它是一个控制台应用程序,承载 了ASP.NET Web API。讲明一点,没有涉及到IIS 。
在安装说明中,我们不得不使用 HTTP.sys注册一个端口和用户,所以操作系统知道它可以发送小的自承载app HTTP 通信。如果你熟悉WCF ,你可能以前做过。
这里是服务器。它是一个控制台应用程序,为清晰起见,减去了错误处理。
1: class Program
2: {
3: static readonly Uri _baseAddress = new Uri("https://localhost:50231/");
4:
5: static void Main(string[] args)
6: {
7: // Set up server configuration
8: HttpSelfHostConfiguration config = new HttpSelfHostConfiguration(_baseAddress);
9:
10: config.Routes.MapHttpRoute(
11: name: "DefaultApi",
12: routeTemplate: "api/{controller}/{id}",
13: defaults: new { id = RouteParameter.Optional }
14: );
15:
16: // Create server
17: var server = new HttpSelfHostServer(config);
18:
19: // Start listening
20: server.OpenAsync().Wait();
21: Console.WriteLine("Listening on " + _baseAddress + " Hit ENTER to exit...");
22: Console.ReadLine();
23: server.CloseAsync().Wait();
24: }
25: }
26:
代码设置了一个路由,启动 self-hosting 进程,然后等待。这里是一个控制器https://localhost:50231/Contact,无论您的HTTP 张贴任何协议给它作为内容类型 JSON,它都会回响。请注意协议是一个C# 类型,作为 Post() 的参数。
1: public class ContactController : ApiController
2: {
3: public Contact Post(Contact contact)
4: {
5: return contact;
6: }
7: }
如果我想的话,我可以使用Curl从另一个命令行张贴,然后将一些 JSON 发送到服务器。
这是实际的命令行。JSON 被返回了。
C:\>curl -X POST -H "Content-Type: application/json" -d "{ Name: 'Scott Guthrie', Age: 67}" https://localhost:50231/api/Contact
这是从命令行获取的,但如果我喜欢的话,我还可以使用 System.Net.Http.HttpClient来从.NET调用:
1: HttpClient client = new HttpClient();
2:
3: Contact contact = new Contact {
4: Name = "Henrik",
5: Age = 100
6: };
7:
8: // Post contact
9: Uri address = new Uri(_baseAddress, "/api/contact");
10: HttpResponseMessage response = await client.PostAsJsonAsync(address.ToString(), contact);
11:
12: // Check that response was successful or throw exception
13: response.EnsureSuccessStatusCode();
14:
15: // Read result as Contact
16: Contact result = await response.Content.ReadAsAsync<Contact>();
17:
18: Console.WriteLine("Result: Name: {0} Age: {1}", result.Name, result.Age);
看到C# 协议对象如何在 JSON 世界和 C# 世界之间轻易来回移动了吗? 正是JSON.NET 开放源码库实现了这一目标。
JSON 和 JavaScript真的是动态的,不过通常它是件麻烦事来尝试将真的动态的 JSON 对象反序列化为强类型的.NET结构。JSON.NET 和 ASP.NET Web API 的模型绑定提供了一个开心的介质——一个中间背景——被称为 JToken。
1: public class ContactController : ApiController
2: {
3: public JToken Post(JToken contact)
4: {
5: return contact;
6: }
7: }
当 JSON导入时, 请查看Watch窗口:
JToken 给予我一个动态的容器,而也是一个类似于 DOM 的导航模型。但如果对我来说不够动态的话,为什么我的方法的参数不能只采取一种"动态"。
C# 是静态类型,这是肯定的,但这并不意味着我不能静态化动态的东西。;)
再次注意Watch窗口。
查看JSON 如何在系统中移动,而没有任何不匹配的阻拦。C#并没有降低JavaScript 和 JSON 的灵活性。
当事物如预期中正常运行时,这使我很开心。