6

我的目标项目是 Windows 8、WinRT 和 Windows Phone 8。我正在使用可移植类库作为解决方案,以便共享源代码。我需要调用在另一个 MVC Web Api 项目中创建的一些 REST 服务,但HttpClient类在 PCL 中不可用。哪个是解决它的好方法?我在考虑一个服务接口,然后为每个平台创建一个项目,在每种情况下使用HttpClientWebClient 适当的类。这种方法可行,但我想知道是否还有其他方法。

4

4 回答 4

25

Microsoft 已将该库重写HttpClient为可移植 (PCL),它位于 NuGet 上目前,它仅作为预发布版提供,因此如果您使用 NuGet GUI 包管理器,请确保您设置为“包括预发布版”。从命令行:

Install-Package Microsoft.Net.Http
于 2013-02-21T16:11:18.987 回答
2

从微软的角度来看,HttpClient 不一定是可移植的。唯一的另一种方法是创建每个项目将实现的单独库,并按照您的描述进行操作。这样,您可以在您希望定位的所有平台上实现通用性。

我认为在您所针对的平台方面存在某种程度的等效性......如果您必须拥有单独的项目,您可以将您的代码文件链接到另一个项目,这样您就不必维护多个项目,或者甚至使用Project Linker(虽然我不知道是否存在 2012 版本)。

于 2013-01-07T13:15:17.660 回答
2

Portable REST 最近在 GitHub 上可用,鉴于 WebClient 不可用,它应该有助于发出 Web 请求:

https://github.com/advancedrei/PortableRest#readme

PortableRest 是一个可移植类库,用于在其他可移植类库中实现 REST API 客户端。它利用 JSON.NET 进行快速、可定制的序列化,并利用 Microsoft.Bcl.Async 库在任何平台上等待执行。它被设计成在很大程度上与 RestSharp 兼容,尽管您需要进行一些更改并重新编译。

此初始版本对简单 JSON 请求的支持有限。更多选项(包括 XML 和希望 DataContract 支持)将在以后的版本中提供。

于 2013-02-11T10:48:11.393 回答
2

很晚了,但这是我必须做的一个简单代码,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);
        }
    }
}
于 2013-10-24T22:20:22.273 回答