2012-05-27 62 views
0

我想用JQuery Mobile和PhoneGap構建移動應用程序。這個應用程序將打到我正在與ASP.NET MVC 3工作的後端。現在,我只是想獲得一個基本的GET/POST工作。我創建了以下測試頁面。通過JQuery Mobile/PhoneGap和ASP.NET MVC跨域服務調用3

<!DOCTYPE html> 
<html> 
    <head> 
    <meta charset="utf-8" /> 
    <title></title> 

    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"> 
    <meta name="apple-mobile-web-app-capable" content="yes"> 

    <link rel="stylesheet" href="resources/css/themes/default/core.css" />  
    <link rel="stylesheet" href="resources/css/themes/default/app.css" /> 

    <script src="resources/scripts/jquery-1.6.4.min.js" type="text/javascript"></script> 
    <script src="resources/scripts/jquery.mobile-1.1.0.min.js" type="text/javascript"></script> 

    <script type="text/javascript"> 
     function initialize() { 
     $.support.cors = true; 
      $.mobile.allowCrossDomainPages = true; 
     } 
    </script> 
    </head> 

    <body onload="initialize();"> 
    <div id="testPage" data-role="page"> 
    <div data-role="header" data-position="fixed"> 
     <h1>TEST</h1> 
    </div> 

    <div data-role="content"> 
     <input id="twitterButton" type="button" value="Test GET via Twitter" onclick="twitterButton_Click();" /> 
     <input id="getButton" type="button" value="Test GET via MVC 3" onclick="getButton_Click();" /> 
     <input id="postButton" type="button" value="Test POST via MVC 3" onclick="postButton_Click();" /> 

     <div id="status"></div> 
    </div> 

    <div data-role="footer" class="ui-bar" data-position="fixed"> 

    </div> 

    <script type="text/javascript"> 
     function twitterButton_Click() { 
     $("#status").html("Testing Twitter..."); 
      var vm = { q:"1" }; 
      $.ajax({ 
     url: "http://search.twitter.com/search.json?q=weekend&rpp=5&include_entities=true&result_type=mixed", 
      type: "GET", 
      dataType: "jsonp", 
      contentType: "application/json", 
      success: twitter_Succeeded, 
      error: twitter_Failed 
      }); 
     } 

     function twitter_Succeeded(result) { 
      $("#status").html("Twitter GET Succeeded!"); 
     } 

     function twitter_Failed(p1, p2, p3) { 
      $("#status").html("Twitter GET Failed :("); 
     } 

     function getButton_Click() { 
      $("#status").html("Testing Get..."); 

      var vm = { q:"1" }; 
      $.ajax({ 
      url: "https://www.mydomain.com/myService/testGet", 
      type: "GET", 
      data: vm, 
      contentType: "application/json", 
      success: get_Succeeded, 
      error: get_Failed 
      }); 
     } 

     function get_Succeeded(result) { 
      $("#status").html("MVC 3 GET Succeeded!"); 
     } 

     function get_Failed(p1, p2, p3) { 
      $("#status").html("MVC 3 GET Failed :("); 
     } 

     function postButton_Click() { 
      $("#status").html("Testing POST..."); 

      var vm = { data:"some test data" }; 
      $.ajax({ 
      url: "https://www.mydomain.com/myService/testPost", 
      type: "POST", 
      data: JSON.stringify(vm), 
      contentType: "application/json", 
      success: post_Succeeded, 
      error: post_Failed 
      });  
     } 

     function post_Succeeded(result) { 
      $("#status").html("MVC 3 POST Succeeded!"); 
     } 

     function post_Failed(p1, p2, p3) { 
      $("#status").html("MVC 3 POST Failed :("); 
     } 
    </script> 
</div> 
</body> 
</html> 

當我在Visual Studio中運行此頁面時,我將AJAX url調用更改爲相對調用。他們完美地工作。但是,因爲我的目標是從PhoneGap內部運行此應用程序,所以我知道該頁面實際上將作爲本地文件運行(http://jquerymobile.com/demos/1.1.0/docs/pages/phonegap.html)。因此,我使用了上面的代碼,並在本地機器上創建了test.html。

當我嘗試運行這段代碼時,Twitter測試就起作用了。奇怪的是,所有這三項操作都在Internet Explorer中運行。但是,當我使用Chrome或FireFox時,測試到我的服務器不起作用。在Chrome中,我注意到控制檯中的以下內容:

XMLHttpRequest cannot load https://www.mydomain.com/myService/testGet?q=1. Origin null is not allowed by Access-Control-Allow-Origin. 

XMLHttpRequest cannot load https://www.mydomain.com/myService/testPost. Origin null is not allowed by Access-Control-Allow-Origin. 

我回顧了這個:Ways to circumvent the same-origin policy。但是,他們似乎都沒有工作。我覺得有一些服務器端配置我錯過了。目前,我的TestGet和TestPost操作如下所示:

[AcceptVerbs(HttpVerbs.Get)] 
public ActionResult TestGet(string q) 
{ 
    Response.AppendHeader("Access-Control-Allow-Origin", "*"); 
    return Json(new { original = q, response=DateTime.UtcNow.Millisecond }, JsonRequestBehavior.AllowGet); 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult TestPost(string data) 
{ 
    Response.AppendHeader("Access-Control-Allow-Origin", "*"); 
    return Json(new { status=1, response = DateTime.UtcNow.Millisecond }, JsonRequestBehavior.AllowGet); 
} 

我覺得我很接近完成這項工作。我錯過了什麼? Anyhelp真誠地感謝。

+1

在post方法中不需要'JsonRequestBehavior.AllowGet' – Rafay

回答

0

嘗試從一個實際的設備或模擬器,它會工作。從常見問題:

跨域安全策略不影響PhoneGap的應用 。由於webkit使用 file://協議調用html文件,因此安全策略不適用。 (在Android中,你可以 android.permission.INTERNET對授予給您的應用程序通過編輯 AndroidManifest.xml中)

它總是與Twitter的工作,因爲它使用JSONP來響應查詢。您必須啓動Chrome或Firefox以正確的方式告訴它允許CORS。對於Chrome,它是:

chrome --disable-web-security