3

我的解决方案包含两个 asp.net MVC 项目。一个是 Web 服务,另一个是普通网站,从前面提到的 Web 服务获取数据。

我的网络服务主控制器中有以下方法:

...
public JSONResult GetTeacher(){
   return JSON(new {TeacherName = this.teacher.name });
}

我正在尝试使用此 $.ajax 方法从其他 Web 应用程序(将成为网站)访问此方法:

$.ajax({
    type: 'GET',
    url: 'localhost:11370/Home/GetTeacher',
    contentType: 'application/json; charset=utf-8',
    success: function (response) {
        alert(JSON.stringify(response));
        $('#results').html('Welcome, ' + response.Name);
    },
    error: function (error) {
        alert(JSON.stringify(error));
    }
});

当我开始调试我的解决方案时,它会打开两个 Web 开发服务器,它们都在不同的端口上。结果,当 $.ajax 调用发生时,我会收到一个包含以下信息的弹出窗口:

the page at localhost:11510 says:
"readystate":0, "responsetext": "" , "status":0, "statustext":"error"

当我尝试直接在 google chrome 控制台中运行脚本时,我收到以下消息:

XMLHttpRequest cannot load http://localhost:11370/Home/GetTeacher. 
Origin http://localhost:11510 is not allowed by Access-Control-Allow-Origin.

任何有关如何使用 $.ajax 实际访问该方法的帮助将不胜感激。

编辑:我还尝试制作一个简单的 html 文件,看看如果我调用网络服务会发生什么。结果相同。此外,当我只输入该方法的 url 时,它可以正常工作并显示老师的姓名。

4

1 回答 1

3

由于same origin policy restriction内置浏览器,您无法发送跨域 AJAX 请求。一种可能的解决方法是使用CORS,但由于并非所有浏览器都支持它,如果您想要一个跨浏览器解决方案,您可以考虑使用JSONP.

你可以看看this custom JsonpResult我写的来说明如何使用来自不同域的控制器操作。需要注意的是,jQuery 的 JSONP 实现仅适用于 GET 请求。您不能 POST 到跨域的控制器操作。如果您需要这样做,实现此目的的唯一可靠方法是在主域上编写一个服务器端脚本,该脚本将充当两个域之间的桥梁。然后,您会将 AJAX 请求发送到这个新脚本,该脚本会将请求委托给远程域并返回结果。

于 2012-11-25T15:44:52.193 回答