第13周的NuGet包—Portable HttpClient使得portable libraries更加好用

[原文发表地址] NuGet Package of the Week #13 - Portable HttpClient makes portable libraries more useful

[原文发表时间] 2013-03-21

一旦你对一个应用程序有了灵感,就好像你获得了实现此程序应用于多个领域的方法。举个例子,当你开始琢磨一款手机应用程序时,接下来就会想着去开发其桌面版、网页版。再举一个例子,当你在一种平台下开发出一款游戏时,就会想让它在任意平台运行。事实上,随着Xamarin技术的诞生,C#实现了用一种语言也能让你的应用程序在这个世界上任何一种AppStore上运行。

您应该已经知道可以选择不同版本的.NET framework,甚至诸如Silverlight 和 tiny .NET Micro Framework, 这些比较小型的.NET framework。

你也可以选择XBox、Windows Phone,或者选择更棒的Portable Libraries——我以前简单地介绍过。Portable Libraries 是一个非常棒的主意,但是当你尝试运用它时会遇到很多问题。幸运的是频道9有一个棒极了(可能有些过时)的视频——它的发明者对它的解说。提醒下,Portable Libraries只是Visual Studio 2012的一个插件。

它的精髓就是写一个library,使其包含尽可能多的共享功能,这样每个应用都可直接使用这个“便携”library。但是,一个可用类的子集就是一个子集。也就是说你只能应用这些你已选目标中可用的那些类。勾选如下对话框:

Choose your target framework

MSDN上这篇关于Portable Libraries的文章中查看特性支持表确定哪些应用可以用在哪儿。这有一张我从Daniel 那儿偷过来的图表

PortableLIbraryChart

然而,很多人对Portal Libraries的应用局限于一种没有实际功能的类ViewModels的使用。我们拥有一个差不多涵盖所有结构体的DLL。网上有很多不错的帖子告诉你如何采用体系结构技术(如间接且合适的接口)来运用Portable Class Libraries。

关于代码重用抱怨最多,并且在Visual Studio用户声音中票选第一的就是——在Portable Class Libraries(包括Windows Phone8)添加HttpClient支持。为什么呢? 因为通过HTTP从远端库获取资源是用户的基本需求,把数据存取添加到portable library使其可在任何环境下使用是多么妙呀。

现在有一款Portable Http Client,你可以通过NuGet获取它。

install-package Microsoft.net.http -pre

下面是一段Get的代码示例。注意我也使用了async和await。

    1: public static async Task<HttpResponseMessage> GetTheGoodStuff() 
    2: {
    3:     var httpClient = new HttpClient();
    4:     HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "https://hanselman.com/blog/");
    5:     var response = await httpClient.SendAsync(request);
    6:     return response;
    7: }

.NET Portable Subset 

如果你打算创建一个Twitter客户端(无聊的示例,请耐心点儿),你可以把JSON HTTP数据存取代码放入一个library,然后通过Windows Phone、Windows Store、WinForms、Console或者其它方式共享这个library。

我希望MS和Mono的家伙们会继续努力使得Portable Libraries 成为和Mono一样优秀的用户选择。就像Portable Libraries团队在做的一样,我也一直在提倡(并且推动着)新思想和新事物的诞生。你会发现很多工作都围绕着web领域展开,所以不用担心,代码重用不管是借助于Portable Libraries还是在编译时连接代码文件,很有可能实现。“画个火柴人”这款游戏源代码的95%都是重用于C#编写的MonoGame

.NET 4 或 Windows Phone 7.5

如果你想在.Net 4或者Windows Phone 7.5上应用HttpClient,提醒下你:当你使用了async和await,很可能会得到一个编译错误。

 Cannot await System.Threading.Task<HttpRequestMessage>

这是因为.Net 4和Windows Phone 7.5不支持async/await关键字。需要添加一个附件到Microsoft.Bcl.Asyncnuget包使得.Net 4和WP7.5支持async和await。有一个帖子介绍了backport怎样运行的详细内容。

相关连接:

· 超赞的webservice示例——Portable Class Libraries在地震数据的应用(PCLs)

· 想把GZip和Deflate应用于任何平台?请参考HttpClient压缩库

· 视频:.NET 4.5:David Kean和Mircea Trofin-Portable Libraries

· 应用于.NET Framework和Windows Phone的Portable HttpClient

· .NET Framework跨平台开发

· 运行在iOS.Windows Store.和Android的“画个火柴人”