在便携式类库中替换PreAuthenticate

时间:2013-01-25 23:16:25

标签: httpwebrequest credentials portable-class-library

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

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

提前致谢

3 个答案:

答案 0 :(得分:1)

您需要编写代码来自行处理。只有在您定位的所有平台上都可以使用API​​时,它才是可移植的。在这种情况下,PreAuthenticate是.NET 4.5和Windows应用商店应用中的新API,因此如果您的目标是任何其他平台(即.NET 4,Silverlight或Windows Phone),它将无法在可移植类库中使用

答案 1 :(得分:1)

我遇到了同样的问题。我尝试将Credentials设置为单个NetworkCredental(用户,传递),但它在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;

答案 2 :(得分:0)

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

HttpClientHandler handler = new HttpClientHandler()
{
    UseDefaultCredentials = true,
    PreAuthenticate = true
};
HttpClient client = new HttpClient(handler);