Unity 在WebGL使用WebService 浏览器中已拦截跨源请求(CORS 头缺少)。

继WCF通信在打包安卓调通之后,开始调研WCF在WebGL中是否能够使用。在Unity中切换至WebGL,测试WCF没有任何问题。

但是打包之后,报了一个,Reflection.Emit的问题。查找资料发下WebGL不支持Reflection.Emit。

最后开始尝试WebService(WebSocket以前用过,是可行的)。

1.用Vs2015,C#创建一个ASP.Net空工程。随后发布一个asmx。(创建的过程中报了一个权限错误,最后用蔡哥电脑创建成功)

2.打开控制面板\管理工具\Internet Information Services (IIS)管理器,把发布在本地的asmx添加到IIS中。

随后在IIS中打开创建的网站,但是出现    HTTP 错误 500.19 - Internal Server Error

最终解决方案:

找到打包asmx的文件夹,右键查看文件夹属性,找到安全选项。添加一个名为Everyone的用户,勾选所有权限。

随后再次打开网站,可以正常显示。

3.随后测试在Unity中对接WebService.

首先尝试使用服务引用,通过service,直接调用方法。

用VS新建一个控制台程序,添加Web服务引用,输入asmx所在网址。随后把生成的Reference.cs文件考到unity中。

同时把System.Web和System.Web.Service两个dll考到Plugins中(两个dll在Unity安装目录下可以找到)

文件准备完毕后,写个脚本直接调用HelloWorld方法。

在Unity中,运行后提示Timeout,随后添加个Timeout=10就没包错了。程序能够正常收到返回结果。

但是打包WebGL后,报错不能运行。

可能Webservice的Dll中,某些方法不能在Webgl中使用。(感觉和WCF在webgl一样)


3.上一种方法不行,最后尝试用WWW的方法,看能不能获取数据.

上面的地址填写后,www返回错误。随后查找资料,发现需要去修改webconfig文件(在本地asmx文件同级目录下)。

添加红圈内标签

之后在Unity中,便可以获取到HelloWorld返回的结果了(是xml格式的)。

4.开始打包WebGl进行测试,测试时,按空格键没有任何反应。随后在FireFox控制台发现报错

浏览器中已拦截跨源请求(CORS 头缺少)。

需要在IIS管理网站中的HTTP响应标头,添加相应规则。

"Access-Control-Allow-Credentials": "true",
"Access-Control-Allow-Headers": "Accept, X-Access-Token, X-Application-Name, X-Request-Sent-Time",
"Access-Control-Allow-Methods": "GET, POST, OPTIONS",
"Access-Control-Allow-Origin": "*",

规则添加完之后,在打包的webgl中测试。能够正常返回结果(结果都是Xml格式的)。

5.后续需要调研大数据量的情况,以及传参数的情况。

参考博客:https://forum.unity.com/threads/how-do-you-consume-a-web-service-from-unity-solved.311484/

传参目前发现需要在方法名后添加  ?参数名=传的值

?username={0}", userid

目前测试了一个方法,传两个参数,再返回一个字符串的情况。

方法名地址不变,传参改成用wwwform的形式:

ipaddress = "http://192.168.1.190:8006/WebService1.asmx/CombineString";


这是服务端的方法:

string CombineString(string x,string y)

{

    return x+y;

}

Unity中WWWForm传的FiledName,需要与方法中的参数名一致。

最终用了11615byte的字节进行测试,发现可以成功返回数据。

猜你喜欢

转载自blog.csdn.net/Witness_K/article/details/80191213