【发布时间】:2019-06-12 16:20:25
【问题描述】:
我想发出一个正确的 HTTPClient 请求。我有一个代码,但我总是收到这样的异常:
- Java.IO.IOException:套接字关闭
- System.OperationCanceledException:操作已取消。
- Java.Net.SocketException:连接重置
- Java.Net.SocketException:软件导致连接中止
- Java.Net.UnknownHostException:android_getaddrinfo 失败:EAI_NODATA(没有与主机名关联的地址)
- Java.Net.UnknownHostException:无法解析主机“tbs.scratchit.ph”:没有与主机名关联的地址
- Java.IO.IOException:isConnected 失败:ETIMEDOUT(连接超时)
- Java.Net.SocketException:recvfrom 失败:ECONNRESET(对等方重置连接)
我总是遇到这些异常、错误。
我开始想知道如何正确创建 Post Async 和 GetAsync 以避免将来出现这些错误?
以下是我创建 HTTP 客户端的方法:
1. 我有一个类调用 Constants,我将在其中声明一个新的 HTTP 客户端,这样我的项目中只有 1 个 HTTPClient
public class Constants
{
public static HttpClient client = new HttpClient();
}
2。我有一个函数,它通过 JSON 发送参数,通过 PHP API 从我的服务器获取数据。
public async void FirstTimeSyncUser(string host, string database, string contact, string ipaddress)
{
try
{
syncStatus.Text = "Checking internet connection";
string apifile = "first-time-sync-user-api.php";
if (CrossConnectivity.Current.IsConnected)
{
syncStatus.Text = "Initializing first-time user sync";
var db = DependencyService.Get<ISQLiteDB>();
var conn = db.GetConnection();
var getData = conn.QueryAsync<UserTable>("SELECT * FROM tblUser WHERE ContactID = ? AND Deleted != '1'", contact);
var resultCount = getData.Result.Count;
var current_datetime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
int count = 1;
var settings = new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore,
MissingMemberHandling = MissingMemberHandling.Ignore
};
if (resultCount == 0)
{
syncStatus.Text = "Getting user data from the server";
var link = "http://" + ipaddress + "/" + Constants.apifolder + "/api/" + apifile;
string contentType = "application/json";
JObject json = new JObject
{
{ "Host", host },
{ "Database", database },
{ "ContactID", contact }
};
Constants.client.DefaultRequestHeaders.ConnectionClose = true;
var response = await Constants.client.PostAsync(link, new StringContent(json.ToString(), Encoding.UTF8, contentType));
if (response.IsSuccessStatusCode)
{
var content = await response.Content.ReadAsStringAsync();
if (!string.IsNullOrEmpty(content))
{
try
{
var dataresult = JsonConvert.DeserializeObject<List<UserData>>(content, settings);
var datacount = dataresult.Count;
for (int i = 0; i < datacount; i++)
{
syncStatus.Text = "Syncing user " + count + " out of " + datacount;
var item = dataresult[i];
var userid = item.UserID;
var usrpassword = item.UsrPassword;
var usertypeid = item.UserTypeID;
var userstatus = item.UserStatus;
var lastsync = DateTime.Parse(current_datetime);
var lastupdated = item.LastUpdated;
var deleted = item.Deleted;
var insertdata = new UserTable
{
UserID = userid,
UsrPassword = usrpassword,
ContactID = contact,
UserTypeID = usertypeid,
UserStatus = userstatus,
LastSync = lastsync,
LastUpdated = lastupdated,
Deleted = deleted
};
await conn.InsertOrReplaceAsync(insertdata);
count++;
}
synccount += "Total synced user: " + count + "\n";
var logType = "App Log";
var log = "Initialized first-time sync (<b>User</b>) <br/>" + "App Version: <b>" + Constants.appversion + "</b><br/> Device ID: <b>" + Constants.deviceID + "</b>";
int logdeleted = 0;
Save_Logs(contact, logType, log, database, logdeleted);
Preferences.Set("userchangeslastcheck", current_datetime, "private_prefs");
FirstTimeSyncSystemSerial(host, database, contact, ipaddress);
}
catch
{
var retry = await DisplayAlert("Application Error", "Syncing failed. Failed to send the data.\n\n Error:\n\n" + content + "\n\n Do you want to retry?", "Yes", "No");
if (retry.Equals(true))
{
FirstTimeSyncUser(host, database, contact, ipaddress);
}
else
{
First_Time_OnSyncFailed();
}
}
}
else
{
Preferences.Set("userchangeslastcheck", current_datetime, "private_prefs");
FirstTimeSyncSystemSerial(host, database, contact, ipaddress);
}
}
else
{
var retry = await DisplayAlert("Application Error", "Syncing failed. Server is unreachable.\n\n Error:\n\n"+ response.StatusCode +" Do you want to retry?", "Yes", "No");
if (retry.Equals(true))
{
FirstTimeSyncUser(host, database, contact, ipaddress);
}
else
{
First_Time_OnSyncFailed();
}
}
}
else
{
SyncUserClientUpdate(host, database, contact, ipaddress);
}
}
else
{
var retry = await DisplayAlert("Application Error", "Syncing failed. Please connect to the internet to sync your data. Do you want to retry?", "Yes", "No");
if (retry.Equals(true))
{
FirstTimeSyncUser(host, database, contact, ipaddress);
}
else
{
First_Time_OnSyncFailed();
}
}
}
catch (Exception ex)
{
Crashes.TrackError(ex);
var retry = await DisplayAlert("Application Error", "Syncing failed. Failed to send the data.\n\n Error:\n\n" + ex.Message.ToString() + "\n\n Do you want to retry?", "Yes", "No");
if (retry.Equals(true))
{
FirstTimeSyncUser(host, database, contact, ipaddress);
}
else
{
First_Time_OnSyncFailed();
}
}
}
3。在获得我需要的数据后,它将通过另一个 POSTASYNC 调用执行另一个函数。在上面的代码中,当我从服务器获取用户数据时,它将执行下一个函数,即 FirstTimeSyncSystemSerial(host, database, contact, ipaddress);
我做错了什么?以及如何改进这一点,以避免这些异常?
【问题讨论】:
-
所有这些异常似乎都表明互联网连接不好......
-
所有这些异常似乎要么是坏连接,要么是对我的坏反应!并且与你在
Mono侧的HttpClient无关... -
@SushiHangover 有没有办法改进我的代码以至少避免这些异常?
-
@G.hakim 有没有办法改进我的代码以至少避免这些异常?
-
@G.hakim 你能远程我吗?使用 anydesk 来查看我需要做哪些改进?我的 anydesk 是 782 114 930
标签: xamarin xamarin.forms xamarin.android