在談Unity3d webPlayer安全沙箱機制之webservices配合

使用Unity3d做過一些項目,一般是發佈爲單機版;鏈接數據庫、鏈接Webservices等都使用過,通常編輯環境下沒問題的發佈後一般也不會有什麼大問題。

現在碰到一個項目需要把Unity3d發佈爲Web版本,起初也沒在意還是按照以往的經驗和步驟進行開發。基本開發完成進行測試需要部署在服務器上時,出現了一個很大的問題與webservices鏈接不上。起初也沒當回事,知道unity3d和flash類似基於安全原因採用了“安全沙箱機制”,於是在服務器的wwwroot放置了"crossdomain.xml"的文件。

內容如下:

<?xml version="1.0" ?> 
 <cross-domain-policy>
  <allow-access-from domain="*" /> 
  </cross-domain-policy>

進行測試發現還是未能與webservices進行鏈接,於是開始陷入了crossdomain.xml的圈子裏開始查看官方的資料,查找“crossdomain.xml”的初始定義。看到官方文檔中提到“crossdomain.xml”存儲格式必須爲ASCII,於是進行編碼轉換後測試仍然不行。繼續各種論壇、百度等搜索找到,說在unity3d安裝目錄“Editor\Data\Tools\SocketPolicyServer”有官方提供的一種策略,可以在服務器上"cmd"下執行,可以爲跨域訪問數據提供安全策略許可。於是按照操作拷貝到服務器中,在命令行“CMD”下執行“sockpol.exe --all”,進行測試依然不行。我茫然了項目測試在即,如果不能順利鏈接webservices就會導致項目整體進度推遲。

於是在進行深入瞭解我想起了一款利器“HttpWatch”,如果熟悉web開發模式應該對它不陌生,這個工具可以監控整個web頁面所訪問的資源情況,通過它可以很清楚觀察各種在前臺看不到了情況。

運行發現一個有趣的現象如圖:


紅色框圖部分就是unity3d的webPlayer訪問的webservices的地址,看到POST請求過後返回的狀態“500 Internal Server Error“,我恍然大悟原來是我的webservices在發佈時提供的POST方式缺失造成的。於是在web.config中”system.web“中添加如下節點配置:

<webServices>
        <protocols>
          <add name="HttpSoap"/>
          <add name="HttpPost"/
          <add name="HttpGet"/>
          <add name="Documentation"/>
        </protocols>
</webServices>
重新鏈接久違的畫面終於出現了,也算是鬆了口氣。

總結一下:開始一直在”crossdomain.xml“中打轉轉原因是不知道它的運行機制,只是道聽途說,不斷的嘗試浪費的很多時間。最後還是從新梳理請求的數據情況找到問題的正解。這也許是一切問題本來就很簡單吧。

希望能幫助一些遇到和我一樣問題的親們。

發佈了30 篇原創文章 · 獲贊 16 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章