我的目标项目是 Windows 8、WinRT 和 Windows Phone 8。我正在使用可移植类库作为解决方案,以便共享源代码。我需要调用在另一个 MVC Web Api 项目中创建的一些 REST 服务,但HttpClient
类在 PCL 中不可用。哪个是解决它的好方法?我在考虑一个服务接口,然后为每个平台创建一个项目,在每种情况下使用HttpClient
或WebClient
适当的类。这种方法可行,但我想知道是否还有其他方法。
4 回答
Microsoft 已将该库重写HttpClient
为可移植 (PCL),它位于 NuGet 上。目前,它仅作为预发布版提供,因此如果您使用 NuGet GUI 包管理器,请确保您设置为“包括预发布版”。从命令行:
Install-Package Microsoft.Net.Http
从微软的角度来看,HttpClient 不一定是可移植的。唯一的另一种方法是创建每个项目将实现的单独库,并按照您的描述进行操作。这样,您可以在您希望定位的所有平台上实现通用性。
我认为在您所针对的平台方面存在某种程度的等效性......如果您必须拥有单独的项目,您可以将您的代码文件链接到另一个项目,这样您就不必维护多个项目,或者甚至使用Project Linker(虽然我不知道是否存在 2012 版本)。
Portable REST 最近在 GitHub 上可用,鉴于 WebClient 不可用,它应该有助于发出 Web 请求:
https://github.com/advancedrei/PortableRest#readme
PortableRest 是一个可移植类库,用于在其他可移植类库中实现 REST API 客户端。它利用 JSON.NET 进行快速、可定制的序列化,并利用 Microsoft.Bcl.Async 库在任何平台上等待执行。它被设计成在很大程度上与 RestSharp 兼容,尽管您需要进行一些更改并重新编译。
此初始版本对简单 JSON 请求的支持有限。更多选项(包括 XML 和希望 DataContract 支持)将在以后的版本中提供。
很晚了,但这是我必须做的一个简单代码,PLC 适用于除 Xbox 360 之外的所有内容(可能也可以)。我无法将 HttpClient 用于此目标列表。
public class WebDownload
{
public class WebDownloadResult
{
public HttpStatusCode StatusCode { get; set; }
public int StatusCodeNumber { get; set; }
public bool ErrorOccured { get; set; }
public string ResultString { get; set; }
}
public static void Download(string url, Action<WebDownloadResult> resultAction)
{
WebDownloadResult response = new WebDownloadResult();
try
{
HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);
IAsyncResult result = (IAsyncResult)myHttpWebRequest.BeginGetResponse(new AsyncCallback(delegate(IAsyncResult tempResult)
{
HttpWebResponse webResponse = (HttpWebResponse)myHttpWebRequest.EndGetResponse(tempResult);
Stream responseStream = webResponse.GetResponseStream();
using (StreamReader reader = new StreamReader(responseStream, Encoding.UTF8))
{
response.ResultString = reader.ReadToEnd();
response.StatusCode = webResponse.StatusCode;
response.StatusCodeNumber = (int)webResponse.StatusCode;
if (resultAction != null) resultAction(response);
}
}), null);
}
catch
{
response.ErrorOccured = true;
if (resultAction != null) resultAction(response);
}
}
}