System.MissingMethodException方法' System.Net.Http.HttpClientHandler.set_Proxy'未找到

时间:2016-12-22 18:33:41

标签: xamarin missingmethodexception

这是一个Xamarin解决方案,我收到此消息标题中的错误。当然,我可以很容易地确认PCL项目中的HttpClientHandler上有一个Proxy属性。并且解决方案构建没有错误。只有当我运行它才会产生这个错误(在Droid或iOS上)并且在它调用实例化HttpClient的PCL中的方法时这样做。请注意,它甚至没有达到该方法。应用程序启动方法中出现错误;例如,UIApplication.Main()

如果我注释掉处理程序并在没有处理程序的情况下实例化HttpClient,只要我在开放的互联网上就可以正常工作。但是我试图让这个从代理服务器开始工作。

进一步调查显示,设备项目没有引用System.Net.Http。所以我添加了这些 - 它表示Xamarin.iOS和Xamarin.Android作为包 - 但它仍然会产生错误。

我不清楚错误告诉我的是什么,但我相信这意味着设备项目无法看到System.Net.Http.HttpClientHandler?

    private HttpClient GetHttpClient()
    {
        WebProxy proxy = new WebProxy(ProxyConfig.Url)
        {
            Credentials = new NetworkCredential(ProxyConfig.Username, ProxyConfig.Password)
        };

        // At runtime, when GetHttpClient is invoked, it says it cannot find the Proxy setter
        HttpClientHandler handler = new HttpClientHandler
        {
            Proxy = proxy,
            UseProxy = true,
            PreAuthenticate = true,
            UseDefaultCredentials = false,
        };
        HttpClient client = new HttpClient(handler);

        // This works when not behind a proxy
        //HttpClient client = new HttpClient();

        return client;
    }

    public async Task GetWeatherAsync(double longitude, double latitude, string username)
    {

        // MissingMethodException is thrown at this point
        var client = GetHttpClient();
        client.BaseAddress = new Uri(string.Format("http://api.geonames.org/findNearByWeatherJSON?lat={0}&lng={1}&username={2}", latitude, longitude, username));

        try
        {
            var response = await client.GetAsync(client.BaseAddress);
            if (response.IsSuccessStatusCode)
            {
                var JsonResult = response.Content.ReadAsStringAsync().Result;
                var weather = JsonConvert.DeserializeObject<WeatherResult>(JsonResult);

                SetValues(weather);
            }
            else
            {
                Debug.WriteLine(response.RequestMessage);
            }
        }
        catch (HttpRequestException ex)
        {
            Debug.WriteLine(ex.Message);
        }
        catch (System.Net.WebException ex)
        {
            Debug.WriteLine(ex.Message);
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
        }
    }

1 个答案:

答案 0 :(得分:4)

Microsoft.Net.Http NuGet package添加到您的平台项目中。如果您在添加此问题时遇到问题,请先尝试安装最新的Microsoft.Bcl.Build package。然后,在安装之后,添加HTTP包。