Share via


微小的开心功能第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。你还可以在新的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 发送到服务器。

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}" 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窗口:

Using JToken to catch a JSON payload

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

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

再次注意Watch窗口。

Using dynamic to catch JSON post payloads

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

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