Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Http请求有时会被卡住或停止';在不稳定的网络上,无法从服务器接收响应_C#_Unity3d_Asp.net Core_Iis_Mono - Fatal编程技术网

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版本。谢谢您的回复,但这与我们的问题不同。问题是请求超时,而服务器确实收到了请求并尝试发送响应。