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.HttpWebRequest
和 System.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
仍处于实验阶段,但仍在不断开发中,并且可能会在每次新更新中得到改进。
使用 WWW
或 UnityWebRequest
对象的唯一缺点是(据我所知 UnityWebRequest
对象)它们需要在 Unity 主线程中 运行,因此您必须使用 Coroutines
而不是将请求推送到不同的线程。只要您没有数百万的网络请求,这就不会导致您的应用出现任何性能问题。并且可能不太容易出错。
更大的问题是 WWW
和 UnityWebRequest
目前在大多数平台上不支持保持活动状态(实际上,WEBGL 可能是个例外)。预计任何 SSL
个加密请求都会产生大量开销(在一台好机器上超过 300 毫秒)。
首先,让我陈述一下我的问题:我的游戏服务器不提供 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.HttpWebRequest
和 System.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
仍处于实验阶段,但仍在不断开发中,并且可能会在每次新更新中得到改进。
使用 WWW
或 UnityWebRequest
对象的唯一缺点是(据我所知 UnityWebRequest
对象)它们需要在 Unity 主线程中 运行,因此您必须使用 Coroutines
而不是将请求推送到不同的线程。只要您没有数百万的网络请求,这就不会导致您的应用出现任何性能问题。并且可能不太容易出错。
更大的问题是 WWW
和 UnityWebRequest
目前在大多数平台上不支持保持活动状态(实际上,WEBGL 可能是个例外)。预计任何 SSL
个加密请求都会产生大量开销(在一台好机器上超过 300 毫秒)。