如何修复Xamarin.Forms中的EconReset?
我已经声明这个HttpClient=newhttpclient()我的项目的每个视图中都有一次。我有一个名为syncpage的页面,这个同步页面有多个POSTASYN功能。当我严格测试我的应用程序时,我遇到了一个错误 Java.Net.SocketException:recvfrom失败:EconReset(由对等方重置连接) 我怎样才能解决这个问题或在将来防止它 下面是我的同步的示例代码。有两个同步功能将按顺序执行。如何改进代码如何修复Xamarin.Forms中的EconReset?,xamarin,xamarin.forms,xamarin.android,Xamarin,Xamarin.forms,Xamarin.android,我已经声明这个HttpClient=newhttpclient()我的项目的每个视图中都有一次。我有一个名为syncpage的页面,这个同步页面有多个POSTASYN功能。当我严格测试我的应用程序时,我遇到了一个错误 Java.Net.SocketException:recvfrom失败:EconReset(由对等方重置连接) 我怎样才能解决这个问题或在将来防止它 下面是我的同步的示例代码。有两个同步功能将按顺序执行。如何改进代码 HttpClient client = new HttpClie
HttpClient client = new HttpClient();
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 }
};
client.DefaultRequestHeaders.ConnectionClose = false;
var response = await 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();
}
}
}
public async void SyncUserClientUpdate(string host, string database, string contact, string ipaddress)
{
try
{
syncStatus.Text = "Checking internet connection";
string apifile = "sync-user-client-update-api.php";
client.DefaultRequestHeaders.ConnectionClose = false;
if (CrossConnectivity.Current.IsConnected)
{
syncStatus.Text = "Initializing user client changes sync";
var db = DependencyService.Get<ISQLiteDB>();
var conn = db.GetConnection();
var datachanges = conn.QueryAsync<UserTable>("SELECT * FROM tblUser WHERE ContactID = ? AND LastUpdated > LastSync AND Deleted != '1'", contact);
var changesresultCount = datachanges.Result.Count;
var current_datetime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
var settings = new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore,
MissingMemberHandling = MissingMemberHandling.Ignore
};
if (changesresultCount > 0)
{
int clientupdate = 1;
for (int i = 0; i < changesresultCount; i++)
{
syncStatus.Text = "Sending user changes to server " + clientupdate + " out of " + changesresultCount;
var result = datachanges.Result[i];
var userid = result.UserID;
var usrpassword = result.UsrPassword;
var usertypeid = result.UserTypeID;
var userstatus = result.UserStatus;
var lastsync = DateTime.Parse(current_datetime);
var lastupdated = result.LastUpdated;
var deleted = result.Deleted;
var link = "http://" + ipaddress + "/" + Constants.apifolder + "/api/" + apifile;
string contentType = "application/json";
JObject json = new JObject
{
{ "Host", host },
{ "Database", database },
{ "UserID", userid },
{ "UsrPassword", usrpassword },
{ "ContactID", contact },
{ "UserTypeID", usertypeid },
{ "UserStatus", userstatus },
{ "LastUpdated", lastupdated },
{ "Deleted", deleted }
};
var response = await 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<ServerMessage>>(content, settings);
var dataitem = dataresult[0];
var datamessage = dataitem.Message;
if (datamessage.Equals("Inserted"))
{
await conn.QueryAsync<UserTable>("UPDATE tblUsers SET LastSync = ? WHERE ContactID = ?", DateTime.Parse(current_datetime), contact);
clientupdate++;
}
else
{
var retry = await DisplayAlert("Application Error", "Syncing failed. Failed to send the data.\n\n Error:\n\n" + datamessage + "\n\n Do you want to retry?", "Yes", "No");
if (retry.Equals(true))
{
SyncUserClientUpdate(host, database, contact, ipaddress);
}
else
{
OnSyncFailed();
};
}
}
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))
{
SyncUserClientUpdate(host, database, contact, ipaddress);
}
else
{
OnSyncFailed();
}
}
}
}
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))
{
SyncUserClientUpdate(host, database, contact, ipaddress);
}
else
{
OnSyncFailed();
}
}
}
synccount += "Total synced client user update: " + clientupdate + "\n";
var logType = "App Log";
var log = "Sent client updates to the server (<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);
SyncUserServerUpdate(host, database, contact, ipaddress);
}
else
{
SyncUserServerUpdate(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))
{
SyncUserClientUpdate(host, database, contact, ipaddress);
}
else
{
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))
{
SyncUserClientUpdate(host, database, contact, ipaddress);
}
else
{
OnSyncFailed();
};
}
}
HttpClient=newhttpclient();
公共异步void FirstTimeSyncUser(字符串主机、字符串数据库、字符串联系人、字符串IP地址)
{
尝试
{
syncStatus.Text=“正在检查internet连接”;
string apifile=“first time sync user api.php”;
if(交叉连接.当前.断开连接)
{
syncStatus.Text=“初始化首次用户同步”;
var db=DependencyService.Get();
var conn=db.GetConnection();
var getData=conn.QueryAsync(“从tblUser中选择*其中ContactID=?并删除!='1',contact”);
var resultCount=getData.Result.Count;
var current_datetime=datetime.Now.ToString(“yyyy-MM-dd HH:MM:ss”);
整数计数=1;
var设置=新的JsonSerializerSettings
{
NullValueHandling=NullValueHandling.Ignore,
MissingMemberHandling=MissingMemberHandling.Ignore
};
if(resultCount==0)
{
syncStatus.Text=“从服务器获取用户数据”;
var link=“http://”+ipaddress+“/”+Constants.apifolder+“/api/”+apfile;
字符串contentType=“application/json”;
JObject json=新的JObject
{
{“主机”,主机},
{“数据库”,数据库},
{“联系人ID”,联系人}
};
client.DefaultRequestHeaders.ConnectionClose=false;
var response=wait client.PostAsync(链接,新的StringContent(json.ToString(),Encoding.UTF8,contentType));
if(响应。IsSuccessStatusCode)
{
var content=await response.content.ReadAsStringAsync();
如果(!string.IsNullOrEmpty(content))
{
尝试
{
var dataresult=JsonConvert.DeserializeObject(内容、设置);
var datacount=dataresult.Count;
对于(int i=0;i“+”应用程序版本:“+Constants.appversion+”
设备ID:“+Constants.deviceID+”;
int logdeleted=0;
保存日志(联系人、日志类型、日志、数据库、日志删除);
Preferences.Set(“userchangeslastcheck”、当前日期时间、“private\u prefs”);
FirstTimeSyncSystemSerial(主机、数据库、联系人、IP地址);
}
抓住
{
var retry=wait DisplayAlert(“应用程序错误”,“同步失败。发送数据失败”。\n\n错误:\n\n“+内容+”\n\n是否重试?”,“是”,“否”);
if(retry.Equals(true))
{
FirstTimeSyncUser(主机、数据库、联系人、IP地址);
}
其他的
{
第一次同步失败();
}
}
}
其他的
{
Preferences.Set(“userchangeslastcheck”、当前日期时间、“private\u prefs”);
F