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

本文关键字:一个 安全 选择 Net System Unity WebRequest | 更新日期: 2023-09-27 18:21:53

首先,让我说明我的问题:我的游戏服务器不提供WebAPI(我们现在没有资源),但我们的客户端正在像web浏览器一样工作,我需要会话ID的cookie支持。

在谷歌上搜索,我发现我能做的最好的事情就是手动设置请求的标题并获得响应标题。我同意这一点,因为我最初是ASP.NET MVC开发人员。

然而,我后来意识到他们使用Dictionary来处理请求和响应。这就是问题所在。我们知道标头可以重复,在我的情况下是Set Cookie。

然后我尝试了另一个,找到了UnityWebRequest类,它仍然在UnityEngine.Experimental.Networking命名空间中(所以我想它仍然是测试版?),但我还是碰碰运气;遗憾的是,他们还使用Dictionary作为标题项。

所以现在我唯一的机会是普通的.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();
    }
}

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

System.Net.HttpWebRequestSystem.Net.WebClient在Unity支持的大多数平台上工作。然而,当你想为Unity Web Player或WebGL构建时,你会遇到问题,因为Unity不支持大多数System.Net网络,因为javascript不能直接访问IP套接字。WebGL网络恢复

正如您已经提到的UnityWebRequest或Unity的遗留WWW对象是您的最佳选择。使用Unity 5.3 UnityWebRequest,可以在大多数平台上工作,包括WebGL和Unity Web播放器。但正如您已经提到的,完整的UnityWebRequest仍然是实验性的,但正在不断开发中,可能会在每次新的更新中改进。

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

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