在 Windows.Web.Http 和 System.Net.Http 中混淆使用哪个版本的 HttpClient;

Posted

技术标签:

【中文标题】在 Windows.Web.Http 和 System.Net.Http 中混淆使用哪个版本的 HttpClient;【英文标题】:Confuse in using which version of HttpClient in Windows.Web.Http and System.Net.Http; 【发布时间】:2014-01-11 21:29:38 【问题描述】:

我是 Web API 和 Windows Store App 8.1 的新手。我正在开发一个与 Web API 通信的 Windows 应用商店应用程序。当我尝试编写以下代码时:

// server:53452/api/demo?ReportingMonth=10&ReportingYear=2013" 

using (HttpClient httpClient = new HttpClient())
        
            using (HttpResponseMessage response = await httpClient.GetAsync(new Uri("address")))
            
                string result = await response.Content.ReadAsStringAsync();
                var prodt = JsonConvert.DeserializeObject<ObservableCollection<Statuses>>(result);
                return prodt;
            
        

我看到 HttpClient 位于 Windows.Web.Http 和 System.Net.Http 中。我应该使用哪个命名空间?

如果我选择 System.Net.Http 命名空间,当我尝试调用启用了 Windows 身份验证的 Web API 时,光标将不会返回到客户端,仍处于未知状态。不知道为什么我没有收到回复。

address = "abc.com:53452/api/demo?ReportingMonth=10&ReportingYear=2013"
using (HttpResponseMessage response = await httpClient.GetAsync(new Uri(address)))

如果我使用Windows.Web.Http 中的HttpClient,Windows 商店应用程序会要求我输入凭据,即使我正确输入了凭据,系统仍会提示输入凭据。谁能解释为什么会这样?

【问题讨论】:

Here's the HttpClient app sample。附带说明一下,还有第三个版本,Microsoft.Net.Http,它是可移植的。 下面的链接指出,Windows 商店应用程序应该从 8.1 开始使用 Windows.Web.Http。 msdn.microsoft.com/en-us/library/windows/apps/hh781239.aspx 如何执行 Windows 身份验证以从 Windows Store 调用 WEB API,我之前用于 System.NET.HtpClient //HttpClientHandler handler = new HttpClientHandler() // // Credentials = CredentialCache.DefaultCredentials / /;如何在 windows.web.httpclient 中做同样的事情 【参考方案1】:

Demystifying HttpClient APIs in the Universal Windows Platform

我应该使用哪一个?

由于这两个 API 在 UWP 中都可用,所以最大的问题是 对于 HTTP 开发人员来说,是在他们的应用程序中使用哪一个。答案是 这取决于几个因素:

    是否需要集成原生 UI 来收集用户凭证,控制 HTTP 缓存读写行为;或传入一个 用于身份验证的特定 SSL 客户端证书?

如果是,则使用 Windows.Web.Http.HttpClient。在这个时候 编写时,Windows.Web.Http API 提供了对 HTTP 的更大控制 UWP 中的设置比 System.Net.Http API。在未来的版本中, System.Net.Http API 也可以增强以支持这些功能 UWP。

    您是否打算编写跨平台的 .NET 代码(跨 UWP/ASP.NET 5/iOS 和 Android)?

如果是,则使用 System.Net.Http API。这允许您编写代码 您可以在其他 .NET 平台(例如 ASP.NET 5 和 .NET)上重复使用 框架桌面应用程序。感谢 Xamarin,这个 API 也是 在 iosandroid 上受支持,因此您可以在这些设备上重用您的代码 平台也是如此。

【讨论】:

Windows.Web.Http.HttpClientassembly 在哪里?该程序集是System.Net.Http,用于跨平台。【参考方案2】:

要执行 HTTP 身份验证,请使用 HttpBaseProtocolFilter 代替 HttpClientHandler

var filter = new HttpBaseProtocolFilter();
filter.ServerCredential = new 
    Windows.Security.Credentials.PasswordCredential(uri.ToString(), "foo", "bar");
var client = new HttpClient(filter);

【讨论】:

以上是关于在 Windows.Web.Http 和 System.Net.Http 中混淆使用哪个版本的 HttpClient;的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Windows.Web.Http 连接到 HTTP 服务器

单元测试Windows.Web.Http HttpClient与模拟的IHttpFilter和IHttpContent,MockedHttpFilter抛出System.InvalidCastExce

Windows.Web.Http.HttpClient 抛出 COMException c#

使用 Windows.Web.Http.HttpClient 类 PATCH 异步请求

Windows.Web.Http.HttpClient.GetStringAsync 总是返回相同的结果

System.Net.Http.HttpClient vs Windows.Web.Http.HttpClient - 主要区别是啥?