C# пост веб-запроса на Raspberry Pi внезапно истекает после смены роутера - PullRequest
0 голосов
/ 07 января 2020

a c# консольная программа, которую я сделал (с Visual Studio) для взаимодействия с iCloud, работала на моем Raspberry Pi с моно в течение нескольких недель без проблем, вчера я сменил маршрутизаторы из-за обновления провайдеров inte rnet, и теперь веб-запрос не выполняется, сообщая, что время ожидания истекло после ожидания в течение минуты или около того. Нет проблем с подключением inte rnet к пи, так как я могу использовать Google и запустить тест скорости без проблем, приложение работает на windows и в моно на моей ма c без проблем на новом маршрутизаторе так что это не может быть моно проблема или проблема с моей программой, я попытался добавить:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
ServicePointManager.ServerCertificateValidationCallback += (s, cert, ch, sec) => { return true; };

к этому коду перед запросом поста (который я получил отсюда: WebClient зависает до времени ожидания ):

using System.Net;

namespace FindMyiPhone
{
    public static class WebClientExtensions
    {
        public static string PostDataToWebsite(this WebClient Client, string Url, string PostData)
        {
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            ServicePointManager.ServerCertificateValidationCallback += (s, cert, ch, sec) => { return true; };

            Client.Encoding = System.Text.Encoding.UTF8;
            Client.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";

            return Client.UploadString(Url, "POST", PostData);
        }
    }
}

Но это не имело значения, это то же самое сообщение об ошибке, которое появляется в окне консоли на моем пи после того, как приложение зависло на минуту:

Configuration File Loaded. Authenticating...
Getting New Session Token.
An Authetication Error Has Occured: System.Security.SecurityException: Post Error.System.Net.WebException: The operation has timed out.
  at System.Net.HttpWebRequest.GetRequestStream () [0x00019] in <a9a08e39ba304bd0a84c49bd158dfc02>:0 
  at System.Net.WebClient.UploadBits (System.Net.WebRequest request, System.IO.Stream readStream, System.Byte[] buffer, System.Int32 chunkSize, System.Byte[] header, System.Byte[] footer) [0x00132] in <a9a08e39ba304bd0a84c49bd158dfc02>:0 
  at System.Net.WebClient.UploadDataInternal (System.Uri address, System.String method, System.Byte[] data, System.Net.WebRequest& request) [0x0007e] in <a9a08e39ba304bd0a84c49bd158dfc02>:0 
  at System.Net.WebClient.UploadString (System.Uri address, System.String method, System.String data) [0x00038] in <a9a08e39ba304bd0a84c49bd158dfc02>:0 
  at System.Net.WebClient.UploadString (System.String address, System.String method, System.String data) [0x00008] in <a9a08e39ba304bd0a84c49bd158dfc02>:0 
  at (wrapper remoting-invoke-with-check) System.Net.WebClient.UploadString(string,string,string)
  at FindMyiPhone.WebClientExtensions.PostDataToWebsite (System.Net.WebClient Client, System.String Url, System.String PostData) [0x0005f] in <304137456c9b40f0a15497433b5d5517>:0 
  at FindMyiPhone.iCloudService.Authenticate (System.String AppleID, System.String Password, System.String AuthToken) [0x00092] in <304137456c9b40f0a15497433b5d5517>:0 
  at FindMyiPhone.iCloudService.Authenticate (System.String AppleID, System.String Password, System.String AuthToken) [0x000b4] in <304137456c9b40f0a15497433b5d5517>:0 
  at FindMyiPhone.iCloudService..ctor (System.String AppleID, System.String Password, System.String AuthToken) [0x00008] in <304137456c9b40f0a15497433b5d5517>:0 
  at FindMy.Program.Authenticate () [0x000b9] in <304137456c9b40f0a15497433b5d5517>:0 

И это метод аутентификации:

private const string ICLOUD_URL = "https://www.icloud.com";
private const string ICLOUD_LOGIN_URL = "https://setup.icloud.com/setup/ws/1/login";
private const string ICLOUD_INIT_CLIENT_URL = "/fmipservice/client/web/initClient";

private WebClient Client;
private string iCloudUrl;

private void Authenticate(string AppleID, string Password, string AuthToken)
{
    if (!string.IsNullOrEmpty(iCloudUrl))
        return;

    Client = new WebClient();
    Client.Headers.Add("Origin", ICLOUD_URL);
    Client.Headers.Add("Content-Type", "text/plain");

    string LoginParameters = $"{{\"apple_id\":\"{AppleID}\",\"password\":\"{Password}\",\"extended_login\":true,\"dsWebAuthToken\":\"{AuthToken}\"}}";

    string Result;

    try
    {
        Result = Client.PostDataToWebsite(ICLOUD_LOGIN_URL, LoginParameters);//this is failing
    }
    catch (WebException e)
    {
        throw new System.Security.SecurityException("Post Error." + e);
    }

    if (Client.ResponseHeaders.AllKeys.Any(k => k == "Set-Cookie"))
    {
        Client.Headers.Add("Cookie", Client.ResponseHeaders["Set-Cookie"]);
        iCloudUrl = JObject.Parse(Result)["webservices"]["findme"]["url"].ToString();
    }
    else
    {
        throw new System.Security.SecurityException("Invalid username or password.");
    }
}

Другие вещи, которые я пробовал

  • Подключение к сети 5 ГГц вместо 2,4 ГГц
  • Перезапуск pi
  • Программа повторной компиляции
  • Ожидание дня в надежде, что он go уйдет (не сработало)

Одна вещь, на которую я хочу обратить внимание, это то, что мой маршрутизатор работает резервная сим, потому что соединение еще не готово (я обновил от adsl до nbn) но это все равно та же скорость, что и у моего старого inte rnet, но программа работает на других устройствах (windows / ma c), поэтому я подумал, что это не проблема.

Итак, мой вопрос: почему он не работает по истечении времени ожидания, если он работает без проблем в течение нескольких недель, но, поскольку я меняю маршрутизатор, он каждый раз дает сбой, и в код программы не было внесено никаких изменений, и mono является последней версией на pi, и моя программа работает по всем остальным не проблема, если кто-то может помочь, пожалуйста, спасибо, я пытался это исправить, но не знаю, что исправить. Я также не могу вернуть старый маршрутизатор, так как специальный модем должен подключиться к телефонной линии до того, как модем теперь не активен, следовательно, он работает на резервной SIM-карте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...