1.解决方式
如果信令服务器连接正常,但web端连接时报此错误,那可能是这种方式解决(之前那种方式为IceServerUrls添加true,本来想尽量少动源码,但那个导致了无法加载json的bug,因此改为下面这种)
如图,修改CommandLineParser类中的TryParseStringArrayArgument(201行)函数中注释的代码为下面的if语句。
if (list.Count == 0)
{
argumentValue = null;
return !required;
}
这里当长度为0时,直接置空,然后根据required(命令行输入时是否必须填写)判断true或者false(必须时为长度为0返回false,否则为true),这里当未输入IceServerUrls的命令行参数时将其值置空,同时返回true,能够继续执行命令行解析的下面的代码
2.原因
在传入命令行参数时,会优先执行CommandLineParser.TryParse(arguments),这里的函数会尝试执行每个参数的解析。
看下图,这是解析IceServerUrls时的函数(CommandLineParser中的函数,大概201行),当解析出来的命令行参数IceServerUrls为空时,正常的处理应该是将值置空,而这里多了个requred参数,当required参数为false时,argumentValue = list.ToArray(),显然虽然list的长度为0,但它初始化了,argumentValue不为空
记住这里的不为空,这里是out传参,找找代码就能发现是修改了m_value的值,导致Value改变不为空
接着在WebSocketSignalingSettings(Http那个也一样)中的ParseArguments函数中
第一步,下图中1,先将json文件解析出来得到ice配置,这里解析是成功了的且正确的。
第二步,重点来了,还记得前面说过有个argumentValue 未置空,导致Value未被置空,而这里的CommandLineParser.IceServerUrls显然是初始化了的,运行CommandLineParser.IceServerUrls.Value,这个显然不为空(长度为0的string数组),导致urls不为空
第三步,这里在克隆m_iceServers的0号位置,传入的参数中有urls(不嫌麻烦的小伙伴可以试试,除了urls,其他三个参数均置空的)
来到这个克隆函数内部,只要传入参数不为空,就覆盖原始的值。当传入了json文件,其他命令行参数没有时,导致传入参数不为空(长度为0的string数组),覆盖了原始的值,ice配置的url被替换,根本连不上啊。
3.后话
非常严重的逻辑上的bug,新创个项目也是一样,打包,用json方式启动后,只有ice的url为空,其他值都能正确处理读取,简直离谱,找了半天bug。