Xamarin可移植类库在iPhone模拟器上获取代理访问权限

时间:2014-02-03 09:14:21

标签: cross-platform ios-simulator xamarin

在尝试访问WCF REST服务时,我遇到了一些iPhone模拟器的问题。 我在Xamarin论坛上问过这个问题,但没有快乐。

某些背景信息:

测试时

  • 我可以从开发机器上的浏览器访问该服务。
  • 我可以通过PCL使用控制台应用程序访问它。
  • 我可以通过应用程序从WiFi网络上的真实Android设备访问它 同一个企业网络。
  • 我可以在构建Mac上从Safari访问它。
  • 我可以在构建Mac上的iPhone模拟器上从Safari访问它。

问题是,一旦我尝试通过iPhone模拟器上的应用程序访问该服务,我就会收到407,代理访问被拒绝错误。

以下是我用来设置连接的代码:

private static HttpRequestMessage PrepareRequestMessage(HttpMethod method, string baseUri, 
    string queryParameters, out HttpClient httpClient, string bodyContent)
{
    var finalUri = new Uri(baseUri + queryParameters);

    var handler = new HttpClientHandler();

    httpClient = new HttpClient(handler);  

    var requestMessage = new HttpRequestMessage(method, finalUri);

    if (handler.SupportsTransferEncodingChunked())
    {
        requestMessage.Headers.TransferEncodingChunked = true;
    }

    if (method == HttpMethod.Post || method == HttpMethod.Put)
    {
        requestMessage.Content = 
            new StringContent(bodyContent, Encoding.UTF8, "application/json");
    }

    return requestMessage;
}

该代码给出了407错误。

我尝试使用SupportsProxy和SupportsUseProxy的各种组合来设置代理。 (两者都从模拟器返回false。) 我试过强制代理设置无论如何。我已经尝试在处理程序本身上设置凭据。我试过玩UseDefaultCredentials和UseProxy标志。我也尝试在邮件头中设置IfModifiedSince值。我也尝试过使用PortableRest包。

所有这些似乎只会让事情变得更糟。我最初得到407错误的地方,对httpClient.GetAsync的调用只会立即返回null。

我在这里有点不知所措,所以任何帮助都会非常感激。

PS。为了完整起见,进行调用的周围代码的其余部分:(请原谅蹩脚的异常处理,我仍在玩错误)

public static async Task<T> SendRESTMessage<T>(HttpMethod method, string baseUri, 
    string queryParameters, T contentObject)
{
    HttpClient httpClient;

    var payload = string.Empty;
    if (contentObject != null)
    {
        payload = JsonConvert.SerializeObject(contentObject);
    }
    var requestMessage = 
        PrepareRequestMessage(method, baseUri, queryParameters, out httpClient, payload);

    HttpResponseMessage responseMessage = null;
    try
    {
        if (method == HttpMethod.Get)
        {
            responseMessage = await httpClient.GetAsync(requestMessage.RequestUri);                    
        }
        else
        {
            responseMessage = await httpClient.SendAsync(requestMessage);
        }
    }
    catch (HttpRequestException exc)
    {
        var innerException = exc.InnerException as WebException;
        if (innerException != null)
        {
            throw new Exception("Unable to connect to remote server.");
        }
    }

    return await HandleResponse<T>(responseMessage);
}

private static async Task<T> HandleResponse<T>(HttpResponseMessage responseMessage)
{
    if (responseMessage != null)
    {
        if (!responseMessage.IsSuccessStatusCode)
        {                                       
            throw new Exception("Request was unsuccessful");
        }

        var jsonString = await responseMessage.Content.ReadAsStringAsync();
        var responseObject = JsonConvert.DeserializeObject<T>(jsonString);
        return responseObject;
    }                

    return default(T);
}        

这是我尝试快速而肮脏地实施IWebProxy,我认​​为这可能会让事情变得更糟:

public class MyProxy : IWebProxy
{
    private System.Net.ICredentials creds;        

    public ICredentials Credentials
    {
        get
        {
            return creds;
        }
        set
        {
            creds = value;
        }
    }

    public Uri GetProxy(Uri destination)
    {
        return new Uri("proxy addy here");
    }

    public bool IsBypassed(Uri host)
    {
        return true;
    }
}

再次感谢您花时间阅读我的问题。

1 个答案:

答案 0 :(得分:2)

所以我终于明白了。

原来这是非常愚蠢的事情,但对iOS移动开发者来说是新手,而且这个服务在模拟器上通过Safari工作的事实让我陷入了困境。

我读到模拟器使用Mac上定义的代理设置。所以我进入网络设置并将服务地址添加到代理绕过列表。

现在就像魅力一样。

如果有人认为有更好的方法,请添加您的意见。

相关问题