GetRequestStream () исключение тайм-аута

Я хотел бы сделать простой запрос Http с помощью Webclient:

public string PostRequest(object json, string contentType, string server)
{
    try
    {
        var request = (HttpWebRequest)WebRequest.Create(server);
        request.ContentType = contentType;
        request.Method = "POST";
        request.Timeout = 10000;
        using (var streamWriter = new StreamWriter(request.GetRequestStream()))
        {
            streamWriter.Write(JsonConvert.SerializeObject(json));
        }


        var response = (HttpWebResponse)request.GetResponse();
        using (var streamReader = new StreamReader(response.GetResponseStream()))
        {
            return streamReader.ReadToEnd();
        }
    }
    catch (Exception e)
    {
        throw e;
    }

}

Проблема в том, что часть request.GetRequestStream () никогда не возвращается и всегда будет иметь тайм-аут (со значениями по умолчанию 100 и 10). Я использую samsung xcover 4 с android 7 и более поздними версиями android 8.1. строка сервера работает отлично при копировании в мой стандартный браузер на ПК. В браузере самого устройства она не работает (тайм-аут). ContentType - это «приложение / json».

Могу ли я что-то сделать, чтобы решить эту проблему, или есть другой способ отправки httprequests в xamarin, которые не сломаны?

сам сервер работает, и я могу пинговать его со своего устройства:

public int PingHost(string nameOrAddress)
{
    int pingCount = 0;
    Ping pinger = null;
    for (int i = 0; i < 4; i++)
    {
        try
        {
            pinger = new Ping();
            PingReply reply = pinger.Send(nameOrAddress);
            pingCount += reply.Status == IPStatus.Success ? 1:0;
        }
        catch (Exception){ pingCount = - 1; }
        finally
        {
            pinger?.Dispose();
        }
        if (pingCount == -1) return -1;

    }
    return pingCount;
}

Спасибо за ваше время.

Вы тестировали свой код со своего компьютера или просто URL-адрес браузера, нужны ли ему учетные данные, вы уверены, что передаете правильный URL-адрес.

TheGeneral 21.09.2018 08:53

Я протестировал его сейчас, и он отлично работает, хотя это та же машина, что и сервер. Но вызов url работает и на компьютере коллеги.

b.holz 21.09.2018 09:02

Работает ли URL-адрес из браузера телефона?

TheGeneral 21.09.2018 09:03

нет, я получаю ту же ошибку тайм-аута (я отредактировал сообщение, чтобы прояснить это). Я протестировал код на другом компьютере, и он сработал. Но это было очень медленно.

b.holz 21.09.2018 09:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
131
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ну, у меня есть рабочий код в моем приложении, и это примерно так:

 public HttpClient apiClient;

GetType API

 public async Task<string> GetServiceData(string srvUrl)
    {
        try
        {
          apiClient = new HttpClient(new NativeMessageHandler(throwOnCaptiveNetwork: false, customSSLVerification: false)); // SSL true if you have custom SLL in your API 
          apiClient.BaseAddress = new Uri(_yourbaseUrl); // Url where the service is hosted
          apiClient.DefaultRequestHeaders.Add("",""); //defualt req header key value in case any
          var respon = await apiClient.GetAsync(srvUrl).Result.Content.ReadAsStringAsync(); // svrUrl is the name of the api that you want to consume 
          if (respon != string.Empty)
          {
               return respon;
          }
        }
        catch (HttpRequestException reqEx)
        {
           return string.Empty;
        }
        catch (Exception ex)
        {
           return string.Empty;
        }
    }

PostType API

  public async Task<string> PostServiceData(string srvUrl, object srvModel)
    {
        try
        {
          var myContent = JsonConvert.SerializeObject(srvModel);//your parameter to the API
          var stringContent = new StringContent(myContent, Encoding.UTF8, "application/json");
          apiClient = new HttpClient(new NativeMessageHandler(throwOnCaptiveNetwork: false, customSSLVerification: true));// SSL true if you have custom SLL in your API
          apiClient.BaseAddress = new Uri(_yourbaseUrl); // Url where the service is hosted
          apiClient.DefaultRequestHeaders.Add("",""); //defualt req header key value in case any
          apiClient.DefaultRequestHeaders.Accept
               .Add(new MediaTypeWithQualityHeaderValue("application/json"));//ACCEPT header
            var respon = await apiClient.PostAsync(srvUrl, stringContent);
                var resReslt = respon.Content.ReadAsStringAsync().Result;
                return resReslt;
            }
            else
                return string.Empty;

        }
        catch (HttpRequestException reqEx)
        {
            return string.Empty;
        }
        catch (Exception ex)
        {
            return string.Empty;
        }

Удачи в случае возврата запросов!

Другие вопросы по теме