Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MonoTouch自动代理网络凭据不工作_C#_Proxy_Xamarin.ios_Webrequest - Fatal编程技术网

C# MonoTouch自动代理网络凭据不工作

C# MonoTouch自动代理网络凭据不工作,c#,proxy,xamarin.ios,webrequest,C#,Proxy,Xamarin.ios,Webrequest,正在尝试从服务器上加载一些数据(xml数据)。我通常只使用HttpWebRequest,因为我可以将AutomaticDecompression设置为DecompressionMethods.GZip | DecompressionMethods.Deflate以自动使用数据的GZip压缩 最近,一位客户给我发电子邮件说,这在他的学校里不起作用。通过TestFlightApp向他发送应用程序的另一个副本,以从他那里获取更多调试信息,应用程序响应407 auth错误。从那时起,我在我的电脑上设置了

正在尝试从服务器上加载一些数据(xml数据)。我通常只使用HttpWebRequest,因为我可以将AutomaticDecompression设置为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的凭据为空。proxy0包含我需要的代理信息,如代理url、端口、用户名,但没有密码

我用我的凭据手动创建了一个WebProxy

WebProxy webProxy = new WebProxy(proxy0.HTTPProxy, proxy0.HTTPPort);
webProxy.Credentials = new NetworkCredential("user", "pass");
request.Proxy = webProxy;
这是有效的。 由于407错误,无法请求代理的用户名和密码,我不知道该怎么办。。。 WebClient下载不起作用,但UIWebView和MKMapView会自动进行身份验证

你知道我遗漏了什么吗

编辑:


发现这个,

我今天看了一下,做了很多调试和浏览苹果的文档-恐怕我没有一个积极的答案给你——除非你认为“不可能”是一个肯定的答案…… 一般问题

根据,
CFProxySupport
不允许您访问存储的代理凭据

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

在Mac OS X上

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

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

在iOS上

从我目前在互联网上读到的内容来看,iOS不允许你访问系统钥匙链——我甚至不确定这是否存在。
CFProxySupport
也不会返回任何凭据

Fwiw.,您也不需要知道代理密码,除非您想在不使用iOS API的情况下进行HTTP访问。所以很有可能根本无法找回它


作为一个解决方案,您可以使用iOS API,如
NSURLConnection
WebClient
与处理程序一起使用。

我注意到:模拟器将Mac OS代理用于其内置应用程序,如Safari。但是,在我用MonoTouch编写的应用程序中未检测到代理。我必须手动设置它。在设备上,默认代理是在设备的网络设置中配置的代理。因此,在设备上使用DefaultWebProxy()就可以了。您是说“HttpWebRequest.DefaultWebProxy”吗?刚刚在我的设备上重新测试了此项,从proxy1到proxy4的凭据均为空,并返回407 still。是否在设备的WLAN设置上设置了代理?是。Safari将通过代理进行导航,UIWebView也将如此。嗯,从iOS获取凭据可能很棘手,不确定。下周我会看一看这个,会在bug报告中发布进度。谢谢你提供的信息!这就是我最终所做的,支持同步/异步和直接写入文件或返回字符串。