Unity3D WebPlayer WebService SecurityException:没有可用于允许访问的有效跨域策略

时间:2013-11-16 07:33:47

标签: c# wcf unity3d

使用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,它不起作用。

2 个答案:

答案 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现在可以返回数据。