4

我正在将库移植到 PCL,并且必须找到管理 HTTP 请求凭据的解决方案。我拿走了像 CredentialCache(不可移植)这样的具体凭据类,现在只使用 ICredentials,因此客户端应用程序可以创建正确的凭据并仅发送接口引用。

然而,还有一件事需要解决。在某些平台上,HttpWebRequest 有一个简洁的 PreAuthenticate 属性来处理初始握手。没有它,客户端需要捕获并响应 401 响应。但是 PreAuthenticate 不是大多数 PCL 配置文件的一部分,我想知道是否有任何解决方案,或者客户端需要自己实现替换逻辑(这很愚蠢,因为这是一段标准代码)。

提前致谢

4

3 回答 3

1

您需要自己编写代码来处理这个问题。一个 API 只有在所有目标平台上都可用时才可移植。在这种情况下,PreAuthenticate 是 .NET 4.5 和 Windows Store 应用程序中的一个新 API,因此如果您针对任何其他平台(即 .NET 4、Silverlight 或 Windows Phone),它在可移植类库中将不可用。

于 2013-01-31T19:26:05.810 回答
1

我有同样的问题。我尝试将 Credentials 设置为单个 NetworkCredental(user, pass),但它在 WinRT 中不起作用,尽管它在 Windoes Phone 中起作用。到目前为止,使其在 WinRT 中工作的唯一方法是通过反射创建 CredentialCache。

var credCacheType = Type.GetType("System.Net.CredentialCache, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
var credCache = credCacheType.GetConstructor(new Type[0]).Invoke(new object[0]);
var addMethod = credCacheType.GetMethod("Add", new Type[] { typeof(Uri), typeof(string), typeof(NetworkCredential) });
addMethod.Invoke(credCache, new object[] { new Uri(_server), "Digest", Credential });
request.Credentials = (ICredentials)credCache;
于 2014-03-22T16:10:45.007 回答
0

PreAuthenticate 可以使用 HttpClient 作为参数构造函数接受的 HttpClienHandler 进行设置,例如:

HttpClientHandler handler = new HttpClientHandler()
{
    UseDefaultCredentials = true,
    PreAuthenticate = true
};
HttpClient client = new HttpClient(handler);
于 2014-05-19T10:38:35.167 回答