首先,让我说明我的问题:我的游戏服务器没有提供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();
}
}
答案 0 :(得分:6)
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
而不是将请求推送到不同的线程。只要您没有数百万的webrequest,这不应该导致您的应用程序的任何性能问题。并且可能不太容易出错。
答案 1 :(得分:1)
更大的问题是WWW
和UnityWebRequest
目前在大多数平台上都不支持keep-alive(实际上WEBGL可能是个例外)。期望任何SSL
加密的请求都会产生大量的开销(在好机器上超过300毫秒)。