Я хотел бы сделать простой запрос 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-адрес из браузера телефона?
нет, я получаю ту же ошибку тайм-аута (я отредактировал сообщение, чтобы прояснить это). Я протестировал код на другом компьютере, и он сработал. Но это было очень медленно.





Ну, у меня есть рабочий код в моем приложении, и это примерно так:
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;
}
Удачи в случае возврата запросов!
Вы тестировали свой код со своего компьютера или просто URL-адрес браузера, нужны ли ему учетные данные, вы уверены, что передаете правильный URL-адрес.