Mono C # включить https с помощью httplistener [duplicate]

У вас могут быть причины ниже?

Первая причина

Поставщик местоположения не дает вам 0.0 значений в виде широты и долготы. Вы получаете то, что вы определили в первый раз. Потому что вы не получили новое местоположение или getLastKnownLocation () возвращает null. Поэтому переменные широты и долготы сохраняют свои первые значения (0.0)

double latitude;
double longitude;

Вторая причина

Всякий раз, когда вы вызываете метод getLocation (), метод getLastKnownLocation () ничего не делает до тех пор, пока onLocationChanged fire ! (в зависимости от поставщика)

@Override
public void onLocationChanged(Location location) {

}

Разработано для «в зависимости от поставщика»

Вы запросили как gps, так и поставщиков сети.

requestLocationUpdates(LocationManager.NETWORK_PROVIDER ... mLocationListener);
requestLocationUpdates(LocationManager.GPS_PROVIDER ... mLocationListener);

И затем вызвал метод getLastKnownLocation для обоих поставщиков

locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

Предположим, что эти два провайдера вернули значение null. В этом случае вам нужно подождать, пока не будет запущен метод onLocationChanged. В противном случае вы получите null из метода getLastKnownLocation в зависимости от поставщика

@Override
public void onLocationChanged(final Location location) {

    String providerName =  location.getProvider();

    if(providerName.equals(LocationManager.GPS_PROVIDER)){
        // onLocationChanged method is fired by gps provider.
        // After this point, getLastKnownLocation(); method returns not-null 
        // for LocationManager.GPS_PROVIDER
    }

    if( providerName.equals(LocationManager.NETWORK_PROVIDER)){
        // onLocationChanged method is fired by network provider.
        // After this point, getLastKnownLocation(); method returns not-null 
        // for LocationManager.NETWORK_PROVIDER
    }
}
38
задан jpaugh 18 November 2015 в 17:20
поделиться

6 ответов

Вам просто нужно привязать сертификат к ip: порту, а затем открыть слушатель с префиксом https: //. 0.0.0.0 применяется ко всем ip. appid - любой случайный GUID, а certhash - хэш сертификата (иногда называемый thumprint).

Выполните следующее с помощью cmd.exe, используя права администратора.

netsh http add sslcert ipport=0.0.0.0:1234 certhash=613bb67c4acaab06def391680505bae2ced4053b  appid={86476d42-f4f3-48f5-9367-ff60f2ed2cdc}

Если вы хотите создать самозаверяющий сертификат для проверки этого,

  1. Открыть IIS
  2. Нажмите на имя вашего компьютера
  3. Нажмите значок «Сертификаты сервера»
  4. Нажмите «Создать самоподписанный сертификат»
  5. Дважды щелкните мышью и перейдите к деталям
  6. Вы увидите отпечаток, просто удалите пробелы.
    HttpListener listener = new HttpListener();
    listener.Prefixes.Add("https://+:1234/");
    listener.Start();
    Console.WriteLine("Listening...");
    HttpListenerContext context = listener.GetContext();
    
    using (Stream stream = context.Response.OutputStream)
    using (StreamWriter writer = new StreamWriter(stream))
        writer.Write("hello, https world");
    
    Console.ReadLine();
    

После запуска этой программы я просто перешел к https://localhost:1234, чтобы увидеть напечатанный текст. Поскольку сертификат CN не соответствует URL-адресу, и он не находится в хранилище доверенных сертификатов, вы получите предупреждение о сертификате. Однако текст зашифрован, как вы можете проверить с помощью инструмента, такого как Wire Shark.

Если вам нужен больше контроля над созданием самоподписанного сертификата x509, openssl - отличный инструмент, и есть порт для окон. У меня был намного больше успеха, чем инструмент makecert.


Также очень важно, чтобы, если вы общаетесь с https-сервисом из кода с предупреждением ssl, вы должны настроить валидатор сертификата в диспетчере точек обслуживания, чтобы обойти его для целей тестирования.

ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, errors) => true;
9
ответ дан Markus Safar 19 August 2018 в 07:45
поделиться

Документация класса

имеет следующее примечание:

Если вы создаете HttpListener с помощью https, вы должны выбрать сертификат сервера для этого слушатель. В противном случае запрос HttpWebRequest этого HttpListener завершится с неожиданным закрытием соединения.

и это:

Вы можете настроить сертификаты сервера и другой прослушиватель с помощью HttpCfg.exe. Подробнее см. В http://msdn.microsoft.com/library/default.asp?url=/library/en-us/http/http/httpcfg_exe.asp . Исполняемый файл поставляется с Windows Server 2003 или может быть создан из исходного кода, доступного в Platform SDK.

Является ли первая заметка объясняемой второй? Как указано в вопросе, я использовал httpcfg.exe для привязки сертификата к определенному порту. Если они намереваются что-то другое, примечание неоднозначно.

6
ответ дан pc1oad1etter 19 August 2018 в 07:45
поделиться

Я столкнулся с той же проблемой, что и вы. К счастью, после того, как googling выполнил жесткие шаги на этой странице , SSL работает с моим HttpListener.

2
ответ дан Rahul Patel 19 August 2018 в 07:45
поделиться

Ниже приведен альтернативный способ привязки SSL-сертификата к комбинации IP / PORT без использования httpcfg.exe (XP) или netsh.exe (Vista +).

http: // dotnetcodebox .blogspot.com.au / 2012/01 / how-to-work-with-ssl-certificate.html

Суть в том, что вы можете использовать C ++ HttpSetServiceConfiguration API встроен в окна, чтобы сделать это программно, а не через командную строку, следовательно, удалить зависимость от ОС и установить httpcfg.

4
ответ дан Steven de Salas 19 August 2018 в 07:45
поделиться
  • 1
    Я опубликовал этот код как пакет Nuget . Не стесняйтесь использовать его. – Serghei Gorodetki 4 June 2015 в 12:55
9
ответ дан Markus Safar 30 October 2018 в 19:56
поделиться
6
ответ дан pc1oad1etter 30 October 2018 в 19:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: