使用Unity3D获取WebService数据:
string str = "http://127.0.0.1:10081/dac/?room=401";
WWW www = new WWW(str);
yield return www;
WebService http://127.0.0.1:10081/crossdomain.xml
必须返回文件:
[OperationContract]
[WebInvoke(BodyStyle = WebMessageBodyStyle.WrappedResponse,
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
UriTemplate = "crossdomain.xml",
Method = "GET")]
string crossdomain();
string IWCFContract.crossdomain()
{
return "<?xml version='1.0'?><cross-domain-policy><allow-access-from domain=* to-ports=* /></cross-domain-policy>";
}
但是我收到以下错误: SecurityException:没有可用于允许访问的有效跨域策略,因为WebService返回&#34; ...&#34;。
如何摆脱双引号?
当我使用套接字时,我可以使用sockpol.cs
来解决这个问题,但是使用WebService,它不起作用。
答案 0 :(得分:3)
Unity3d有很多保护,特别是在网络版本上。
您需要提供'crossdomain.xml'文件。
此保护的本质是防止您在玩游戏时恶意使用某人的计算机。
Unity's explanation of the problem and solution
您的crossdomain.xml应如下所示:
<?xml version="1.0" ?>
<cross-domain-policy>
<allow-access-from domain="*"/>
<allow-access-from domain="mywebsite.com"/>
<allow-access-from domain="www.mywebsite.com"/>
<allow-access-from domain="localhost.mywebsite.com"/>
<allow-access-from domain="localhost"/>
</cross-domain-policy>
答案 1 :(得分:-2)
namespace WCF.HTTP.Unity3d
{
public class WCFService : IWCFContract
{
DataCfg m_dataCfg = new DataCfg();
Stream SetContext(string str)
{
OutgoingWebResponseContext context = WebOperationContext.Current.OutgoingResponse;
context.Headers.Add(System.Net.HttpResponseHeader.CacheControl, "public");
context.ContentType = "text/plain";
// context.LastModified = date_image_was_stored_in_database;
context.StatusCode = System.Net.HttpStatusCode.OK;
return new MemoryStream(UTF8Encoding.Default.GetBytes(str));
}
Stream IWCFContract.GetRoom(String roomName)
{
Loger.Instance.Info("IWCFContract.GetRoom:"+roomName);
Data_Room data_room = m_dataCfg.ReadXml(roomName);
string sJson = LitJson.JsonMapper.ToJson(data_room);
return SetContext(sJson);
}
Stream IWCFContract.crossdomain()
{
return SetContext("<?xml version='1.0'?><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"*\" /></cross-domain-policy>");
}
和另一个cs文件:
namespace WCF.HTTP.Unity3d
{
[ServiceContract]
public interface IWCFContract
{
[OperationContract]
[WebInvoke(BodyStyle = WebMessageBodyStyle.Bare,
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
UriTemplate = "crossdomain.xml",
Method = "GET")]
Stream crossdomain();
[OperationContract]
[WebInvoke(BodyStyle = WebMessageBodyStyle.Bare,
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
UriTemplate = "/dac/room={room}",//&index={index}
Method = "GET")]
Stream GetRoom(String room);
我解决了这个问题。 WebService现在可以返回数据。