2012-05-27 39 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