c# - MonoTouch 自动代理网络凭据不起作用

标签 c# proxy xamarin.ios webrequest

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

最近,一位客户给我发电子邮件说,这在他的学校内部不起作用。通过 TestFlightApp 向他发送了应用程序的另一个副本,以从他那里获取更多调试信息,应用程序以 407 身份验证错误响应。从那时起,我在我的计算机上设置了一个代理,我通过它重定向我的 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 的凭据为空。 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

最佳答案

我今天看了这个,做了很多调试并浏览了苹果的文档 - 恐怕我没有给你一个肯定的答案 - 除非你认为“不可能”是一个肯定的答案.. .

一般问题

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

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

在 Mac OS X 上

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

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

在 iOS 上

据我目前在互联网上读到的内容,iOS 不允许您访问系统钥匙串(keychain) - 我什至不确定它是否存在。 CFProxySupport 也不会返回任何凭据。

Fwiw.,您也不需要知道代理密码,除非您想在不使用 iOS API 的情况下进行 HTTP 访问。因此很有可能无法检索它。

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

关于c# - MonoTouch 自动代理网络凭据不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13576522/

相关文章:

c# - 当我尝试在 VS 中添加文件时加载类型库/DLL 时出错(HRESULT : 0x80029C4A)

linux - 认证代理

c# - Xamarin.Forms.Navigation.PopAsync() 不弹出页面

swift - 在 Xamarin 应用程序中绑定(bind) Swift 库时出现代码签名问题

c# - 在列表框中添加/删除项目的事件 c#.NET

c# - 在 C# 中使用 Bouncy CaSTLe 验证 ECDSA 签名

https - squid ssl-bump 3.5.4:错误-协商FD 10上的SSL连接时出现错误:成功(0)

objective-c - 延迟动画开始后,UIButton 上的触摸事件停止

c# - 自动化 .NET Framework 类引用

Eclipse Kepler 无法通过代理连接到互联网