C# Http请求有时会被卡住或停止';在不稳定的网络上,无法从服务器接收响应
我们正在运行C# Http请求有时会被卡住或停止';在不稳定的网络上,无法从服务器接收响应,c#,unity3d,asp.net-core,iis,mono,C#,Unity3d,Asp.net Core,Iis,Mono,我们正在运行.NET Core 2.2IIS服务器和Unity 2018.4.2.f1客户端。客户端使用.net的HttpClient向服务器发送GETHttp(非https)请求。有时,客户机没有收到来自服务器的响应,最终达到超时(即使超时非常长)。但是,在服务器端,它确实显示已发送响应 另一个可能发生的问题是,发送正文为几百KB的POSTHttp(非https)请求时。“上传”可能会在任何时候暂停,最终也会超时 这些问题主要发生在卫星网络模拟器上进行测试时,该模拟器限制在128千比特/秒,数
.NET Core 2.2
IIS
服务器和Unity 2018.4.2.f1
客户端。客户端使用.net的HttpClient
向服务器发送GET
Http(非https)请求。有时,客户机没有收到来自服务器的响应,最终达到超时(即使超时非常长)。但是,在服务器端,它确实显示已发送响应
另一个可能发生的问题是,发送正文为几百KB的POST
Http(非https)请求时。“上传”可能会在任何时候暂停,最终也会超时
这些问题主要发生在卫星网络模拟器上进行测试时,该模拟器限制在128千比特/秒
,数据包复制、重新排序和丢失率很少。因此,基本上,一个非常糟糕的网络(这是我们案例中的一个要求)。在我们的常规办公网络中,这种情况几乎从未发生过(不幸的是,我想不起来是在一两个月前)
我们尝试了轮询Google的generate_204页面,但同样的问题很少出现。我们已经在Windows
笔记本电脑和Linux
NUC上测试了该客户端。我们已经尝试延长我们能找到的每一个超时时间(包括删除Kestrel的MinRequestBodyDataRate
和MinResponseDataRate
),但没有解决它。但是,我们不再怀疑这是一个超时,因为如果我们在客户端上人为地将POST上载速度降低到4kb/s,我们已经看到99%的长客户端超时都是成功的请求。这与正常情况相反,成功的帖子最多会占用40%的超时时间
我们已经将客户端剥离为一个新的Unity项目,只需要http请求,仍然是偶尔的超时。我们尝试了UnityWebrequest
而不是HttpClient
,同样的交易(这是预期的,因为他们可能使用相同的底层HttpWebRequest
)
那么,有人知道这是否是我们可以调整的一些客户机/服务器设置吗?还是其他解决问题的方法?我们处于一个封闭的网络中,因此我们可以自由地进行不安全的修复(因此我们可以使用http来显著缩短响应时间)。我在自己的Unity项目中也遇到过类似的问题。服务器不稳定或用户的internet连接不稳定,导致意外结果。幸运的是,我构建了我的应用程序,使我的所有WebRequest都通过相同的管道,这使得处理此类错误更加一致 如果连接有internet连接,我会在连接上应用重试,否则我会显示一个弹出窗口,提示用户启用/修复他们的internet连接。如果单击弹出窗口,则无法完成的操作将被重新调用 以下是我使用的:
private const string _baseUrl = "your base url here";
private static IEnumerator CreatePostRequest(string url, List<KeyValuePair<string, string>> postParameters, Action<string> callback)
{
if (!HasInternetConnection())
{
Action retryAction = () => CoroutineHandler.Handle(CreatePostRequest(url, postParameters, callback));
// Show popup and attach the retry action as a callback to it
yield break;
}
int tryCounts = 3;
for (int i = 0; i < tryCounts; i++)
{
string post_url = _baseUrl + url;
WWWForm form = new WWWForm();
foreach (var parameter in postParameters)
{
form.AddField(parameter.Key, parameter.Value);
}
UnityWebRequest www = UnityWebRequest.Post(post_url, form);
www.chunkedTransfer = false;
yield return www.SendWebRequest();
if (www.error == null && www.responseCode <= 200 && !www.downloadHandler.text.Contains("ERROR"))
{
var result = www.downloadHandler.text;
callback?.Invoke(result);
break;
}
else
{
string errorMessage = string.Format("Url: {0}, TryNumber: {1}, Parameters: {2}, Error: {3}, ResponseCode: {4}",
_baseUrl + url,
(i + 1).ToString(),
"PARAMS: " + string.Join(" - ", postParameters.Select(x => x.Key + ": " + x.Value)),
www.error,
www.responseCode);
// Your error logging class/ method here
// MessageLogger.LogError(errorMessage);
yield return new WaitForSecondsRealtime(0.15f);
}
}
}
private const string\u baseUrl=“此处的基本url”;
私有静态IEnumerator CreatePostRequest(字符串url、列表后参数、操作回调)
{
如果(!HasInternetConnection())
{
Action retryAction=()=>CoroutineHandler.Handle(CreatePostRequest(url、后参数、回调));
//显示弹出窗口并将重试操作作为回调附加到它
屈服断裂;
}
int tryCounts=3;
for(int i=0;i
.NETCore 2.1稳定,您尝试过这个版本吗?@knocte没有。但是,由于问题也发生在使用Google的generate_204时,因此我们假设它与dotnet core版本无关,更可能与某个地方的配置有关。无论如何,您不应该使用不稳定的.netCore版本。谢谢您的回复,但这与我们的问题不同。问题是请求超时,而服务器确实收到了请求并尝试发送响应。