继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控制台发现报错
需要在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的字节进行测试,发现可以成功返回数据。