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

3
这是一个Xamarin解决方案,我遇到了这个消息标题中的错误。当然,我可以轻松确认PCL项目中的HttpClientHandler上有一个Proxy属性。而且解决方案构建没有错误。只有当我运行时,它才会在调用PCL中实例化HttpClient的方法时产生此错误(在Droid或iOS上都是如此)。请注意,它甚至没有到达该方法。错误出现在应用程序启动方法上;例如,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);
        }
    }

你能用 MVCE 重现它吗?这可能是你正在引用的 dll 和运行时实际可用的 dll 之间不匹配,但使用代码可能更容易追踪。 - Icepickle
我会添加代码,但不认为这会有所帮助。它可以构建/编译而没有问题。所有的智能感知引用都很正常。只有在运行时,当它去调用实例化方法时,才会产生错误。我相信这是某种引用问题,但就是想不出来。 - AdvApp
1个回答

5

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


就是这样。我之前尝试添加Microsoft.Net.Http包,但它回应“无法添加包”。后来,我发现我必须将Microsoft.Bcl.Build包添加到所有项目中,并已经这样做了。但我从未回过头来再尝试Microsoft.Net.Http包。谢谢! - AdvApp
2
我已经按照这些步骤进行了操作,但仍然出现这种行为。它必须是特定版本吗? - LDJ
当我在HttpClient上设置“AutomaticDecompression = DecompressionMethods.GZip”后,出现“http.httpclienthandler.set_automaticdecompression未找到”的情况也适用。 - Zef
这对我有用...安装Microsoft.Net.Http和microsoft.Bcl.Build,谢谢。 - Jeffrey Holmes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接