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

时间:2015-11-12 23:01:42

标签: c# cookies unity3d mono network-programming

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

使用Google搜索,我发现我能做的最好的事情是手动设置请求标头并获取响应标头。我很好,因为我最初是ASP.NET MVC开发人员。

然而,我意识到他们对请求和响应都使用Dictionary。现在问题就在于此。我们知道标题可以重复,在我的例子中是Set-Cookie。

然后我尝试了另一个,找到了UnityWebRequest类,它仍在UnityEngine.Experimental.Networking名称空间中(所以我认为它还处于测试阶段?),但我还是试试运气;只有悲伤实现它们也使用词典标题项目。

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

这是我目前的解决方案,它在Unity编辑器中运行良好,但我还没有在其他设备上测试它们。对此有什么解决方案吗?

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();
    }
}

2 个答案:

答案 0 :(得分:6)

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而不是将请求推送到不同的线程。只要您没有数百万的webrequest,这不应该导致您的应用程序的任何性能问题。并且可能不太容易出错。

答案 1 :(得分:1)

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