2016-12-22 2 views
2

Это решение Xamarin, и я получаю ошибку, найденную в заголовке этого сообщения. Конечно, я могу легко подтвердить, что в проекте PCL есть свойство Proxy на HttpClientHandler. И решение строится без ошибок. Только когда я запускаю, он вызывает эту ошибку (на Droid или iOS) и делает это в той точке, где он вызывает метод в PCL, который создает экземпляр HttpClient. Обратите внимание, что он даже не доходит до этого метода. Ошибка появляется при запуске приложения; например, UIApplication.Main()System.MissingMethodException Method 'System.Net.Http.HttpClientHandler.set_Proxy' не найден

Если я прокомментирую обработчик и создаю экземпляр 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); 
     } 
    } 
+0

Можете ли вы воспроизвести его с помощью [MVCE] (http://stackoverflow.com/help/mcve)? Это может быть несоответствие между dll, на которую вы ссылаетесь, и фактической dll, доступной во время выполнения, но с кодом может быть намного проще отслеживать – Icepickle

+0

Я добавлю код, но не думаю, что это поможет. Он строит/компилирует проблему. Все ссылки на intellisense счастливы. Только во время выполнения, когда он запускает вызов метода, который создает экземпляр, он вызывает ошибку. Я убежден, что это какой-то справочный вопрос, но просто не могу понять. – IronRod

ответ

3

Добавьте Microsoft.Net.HttpNuGet package к вашему проекту платформы тоже. Если у вас возникла проблема с добавлением этого, попробуйте сначала установить последнюю версию Microsoft.Bcl.Buildpackage. Затем, после этого, добавьте пакет HTTP.

+0

Вот и все. Я попытался добавить пакет Microsoft.Net.Http раньше, но он ответил «Не удалось добавить пакет». Впоследствии я обнаружил, что должен добавить пакет Microsoft.Bcl.Build ко всем проектам и сделал это. Но я никогда не возвращался и снова попробовал пакет Microsoft.Net.Http. Благодаря! – IronRod

+2

Я выполнил эти шаги, но все еще получаю такое поведение. Должны ли они быть конкретными версиями? – LDJ

+0

Это также применялось, когда я получал «http.httpclienthandler.set_automaticdecompression не найден» после установки «Автоматическое декомпрессирование = DecompressionMethods.GZip» на HttpClient – zef

 Смежные вопросы

  • Нет связанных вопросов^_^