WebRequest (System.Net) 在 Unity 中是一个安全的选择吗?

Is WebRequest (System.Net) a safe choice in Unity?

首先,让我陈述一下我的问题:我的游戏服务器不提供 WebAPI(我们现在没有资源),但是我们的客户端正在尝试像网络浏览器一样工作,我需要 cookie 支持Session ID.

通过 Google 搜索,我发现我能做的最好的就是手动设置请求的 header 并获得响应 header。我同意,因为我最初是 ASP.NET MVC 开发人员。

但是,我随后意识到他们对请求和响应都使用 Dictionary。现在这就是问题所在。我们知道 header 可以重复,在我的例子中是 Set-Cookie.

然后我尝试了另一个,发现 UnityWebRequest class,它仍在 UnityEngine.Experimental.Networking 命名空间中(所以我想它仍处于测试阶段?),但我尝试了我的无论如何运气;只是很遗憾地意识到他们也使用词典来处理 header 项。

所以现在我唯一的机会是 vanilla .NET WebRequest(在 System.Net 命名空间中)。但是,我没有看到有关 Unity 中 .NET Framework 兼容性的文档。谁能告诉我大多数平台是否支持它?我的主要目标是 Windows、Android 和 Web。可以的话,连WebClient就更好了

这是我目前的解决方案,它在 Unity Editor 中运行良好,但我还没有在其他设备上测试它们。有解决办法吗?

public class CookieWebRequest
{

    private CookieContainer cookieContainer;


    public CookieWebRequest()
    {
        this.cookieContainer = new CookieContainer();
    }

    public void GetAsync(Uri uri, Action<HttpWebResponse> onFinished)
    {
        var webRequest = HttpWebRequest.Create(uri) as HttpWebRequest;
        webRequest.Method = WebRequestMethods.Http.Get;
        webRequest.CookieContainer = this.cookieContainer;

        new Thread(() =>
        {
            HttpWebResponse httpResponse;
            try
            {
                httpResponse = webRequest.GetResponse() as HttpWebResponse;
            }
            catch (WebException ex)
            {
                if (onFinished != null)
                {
                    onFinished(ex.Response as HttpWebResponse);
                }
                return;
            }


            if (httpResponse.Cookies != null && httpResponse.Cookies.Count > 0)
            {
                this.cookieContainer.Add(httpResponse.Cookies);
            }

            if (onFinished != null)
            {
                onFinished(httpResponse);
            }

            httpResponse.GetResponseStream().Dispose();
        }).Start();
    }
}

System.Net.HttpWebRequestSystem.Net.WebClient 适用于 Unity 支持的大多数平台。但是,当你想为 Unity Web Player 或 WebGL 构建时,你会 运行 遇到问题,因为 Unity 不支持大多数 System.Net 网络内容,因为 javascript 无法直接访问 IP插座。 WebGL network restictions

正如您已经提到的 UnityWebRequest 或来自 Unity 的遗留 WWW 对象是您最好的选择。使用 Unity 5.3 UnityWebRequest 适用于大多数平台,包括 WebGL 和 Unity Web 播放器。但正如您也已经提到的,完整的 UnityWebRequest 仍处于实验阶段,但仍在不断开发中,并且可能会在每次新更新中得到改进。

使用 WWWUnityWebRequest 对象的唯一缺点是(据我所知 UnityWebRequest 对象)它们需要在 Unity 主线程中 运行,因此您必须使用 Coroutines 而不是将请求推送到不同的线程。只要您没有数百万的网络请求,这就不会导致您的应用出现任何性能问题。并且可能不太容易出错。

更大的问题是 WWWUnityWebRequest 目前在大多数平台上不支持保持活动状态(实际上,WEBGL 可能是个例外)。预计任何 SSL 个加密请求都会产生大量开销(在一台好机器上超过 300 毫秒)。