MonoTouch自动代理网络凭据无法正常工作

时间:2012-11-27 02:30:38

标签: c# proxy xamarin.ios webrequest

尝试从我的服务器加载一些数据(xml数据)。我通常只使用HttpWebRequest,因为我可以将utomaticDecompression设置为DecompressionMethods.GZip | DecompressionMethods.Deflate,以便自动使用gzip压缩我的数据。

最近,一位客户通过电子邮件发送给我,说它在学校内无效。通过TestFlightApp向他发送了另一个应用程序副本,以获取更多来自他的调试信息,应用程序以407 auth错误响应。从那时起,我在我的计算机上设置了一个代理,我将我的iPhone流量重定向到测试。

我原来的设置是这样的,

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(_url);
request.CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore);
request.Proxy = null;
request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
WebResponse response = request.GetResponse();

然后从那里开始。

我将Proxy设置为null,因为在大多数情况下,用户不会在代理后面,这会导致1-2秒的代理解析。稍后会有代码捕获这个,然后重新创建HttpWebRequest,但不要使代理无效,我认为这将是默认代理。显然不是这样......

我尝试获取设备的默认代理设置。

CFProxySettings proxy0 = CFNetwork.GetSystemProxySettings();
IWebProxy proxy1 = WebRequest.GetSystemWebProxy();
IWebProxy proxy2 = HttpWebRequest.DefaultWebProxy;
IWebProxy proxy3 = HttpWebRequest.GetSystemWebProxy();
IWebProxy proxy4 = CFNetwork.GetDefaultProxy();

proxy1 - proxy4的凭据为null。 proxy0包含我需要的代理信息,如代理URL,端口,用户名,但没有密码......

我用我的凭据手动制作了一个WebProxy

WebProxy webProxy = new WebProxy(proxy0.HTTPProxy, proxy0.HTTPPort);
webProxy.Credentials = new NetworkCredential("user", "pass");
request.Proxy = webProxy;

这是有效的。 在407错误上没有请求代理的用户名和密码我不知道该怎么办... WebClient下载不起作用,但UIWebView和MKMapView会自动进行身份验证。

我缺少什么想法?

编辑:

找到了这个,https://bugzilla.xamarin.com/show_bug.cgi?id=1081

1 个答案:

答案 0 :(得分:3)

我今天看了这个,做了很多调试和浏览Apple的文档 - 我担心,我没有给你一个肯定的答案 - 除非你认为“不可能”作为一个肯定的答案。

一般问题

根据Apple's DocumentationCFProxySupport不允许您访问存储的代理凭据。

有一种 - 未记录的 - 获取代理用户名的方法(返回的字典使用字符串作为键,其中一个键称为“HTTPUser”或“HTTPProxyUsername”,但我找不到任何字符串常量) ,但不是密码。

在Mac OS X上

在Mac OS X上实际上有一个解决方案:当我运行一个简单的基于NSURLConnection的示例时,它要求我获得访问钥匙串的权限,因此我打开了Keychain Utility并在登录中找到了代理凭据钥匙扣。我还写了一个简单的Objective C函数来检索它,但你需要知道代理用户名(但我还没有尝试使用NULL,也许这有用)。

除了检查该用户名是否为NULL之外,我还找不到任何检查是否需要身份验证的方法。不幸的是,您需要密钥链访问权限来检查某个项是否存在,因此我们需要确保实际需要进行身份验证。一种方法是在它已经收到HTTP 407之后从HttpWebConnection内部(其中也包含所需的用户名)。

在iOS上

从我到目前为止在互联网上看到的内容来看,iOS不允许您访问系统密钥链 - 我甚至不确定它是否存在。 CFProxySupport也不会返回任何凭据。

Fwiw。,除非您想在不使用iOS API的情况下进行HTTP访问,否则您也不需要知道代理密码。所以有一个很好的机会,没有办法检索它。

作为解决方案,您可以使用NSURLConnectionWebClient等iOS API和CFNetwork处理程序。