Исключение тайм-аута GetRequestStream () - PullRequest
0 голосов
/ 21 сентября 2018

Я хотел бы сделать простой 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 - это «application / 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;
}

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

1 Ответ

0 голосов
/ 21 сентября 2018

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

 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;
        }

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

...