微小的开心功能第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和更多)中的尖括号家伙们(我对网络平台和工具团队的称呼)已投入了大量的工作到我有时称之为"一千个微小伤亡"中。小小的眼中钉会如同大的缺失功能一样(或更加)令人沮丧。

REST, POX, and WCF compared to RESTtafarians, a guy with a bag on his head and Darth Vader我不想长篇大论(虽然我有时会这样做),我会展示一些团队致力于的微小的开心功能,正是这些微小的功能让生活变得更加美好。有些是大功能的,有些是小的,但它们都是微小的开心功能。

有的企业 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。你还可以在新的http://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("http://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 进程,然后等待。这里是一个控制器http://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 发送到服务器。

POSTing JSON from CURL to ASP.NET Web API

这是实际的命令行。JSON 被返回了。

C:\>curl -X POST -H "Content-Type: application/json" -d "{ Name: 'Scott Guthrie', Age: 67}" http://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窗口:

Using JToken to catch a JSON payload

JToken 给予我一个动态的容器,而也是一个类似于 DOM 的导航模型。但如果对我来说不够动态的话,为什么我的方法的参数不能只采取一种"动态"。

C# 是静态类型,这是肯定的,但这并不意味着我不能静态化动态的东西。;)

再次注意Watch窗口。

Using dynamic to catch JSON post payloads

查看JSON 如何在系统中移动,而没有任何不匹配的阻拦。C#并没有降低JavaScript 和 JSON 的灵活性。

当事物如预期中正常运行时,这使我很开心。

Comments (0)

Skip to main content