Web开发中,常常会遇到跨域的问题,像这个样子
园子里或者网上有各种解决办法示例,但是基本上照做下来都不会像示例当中那样顺利,至少我就是这样。。
于是查找结合各种资料,外加亲自实践,终于完成了这个“亲测可用”的例子。
本人文笔不咋地,更加别谈排版美化了,或许有些地方会表述的不清楚,但别慌,咱有源码献上 -:)
文章中不会介绍概念,如 Access-Control-Allow-Origin,CORS等,因为这些网上一大把。
测试环境:Windows10+VS2012+Microsoft.AspNet.WebApi.Cors5.2.3+jquery-1.8.2
好了,先上图,看得更直观(图片比较大,可能需要等待一会才能看见..)
细心的朋友可能发现了,图中客户端的 alert("成功")没有执行,是因为
var resultstatus = json.Data.status; status的首字母我写成小写了,因为返回的Json中是首字母是大写,正确的应该是
var resultstatus = json.Data.Status;
Ajax支持跨域实现步骤
1.VS2012中创建ASP.NET MVC 4 Web 应用程序,选择项目模版Web API。
2.添加引用 Microsoft.AspNet.WebApi.Cors
添加方法一: 项目-引用-管理Nuget程序包-搜索”Microsoft.AspNet.WebApi.Cors“ 安装
添加方法二: 菜单“工具”,“Nuget程序包管理器”,“程序包管理器控制台”,然后在控制台输入命令行:Install-Package Microsoft.AspNet.WebApi.Cors
3.服务端配置启用
3.1 打开 App_Start/WebApiConfig.cs, 将代码config.EnableCors(); 添加到WebApiConfig.Register方法中
public static void Register(HttpConfiguration config)
{
config.EnableCors();//启用Cors支持
config.Formatters.Remove(config.Formatters.XmlFormatter); //WebApi默认返回数据格式为Xml,加了这句就可以返回Json啦
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
// 取消注释下面的代码行可对具有 IQueryable 或 IQueryable<T> 返回类型的操作启用查询支持。
// 若要避免处理意外查询或恶意查询,请使用 QueryableAttribute 上的验证设置来验证传入查询。
// 有关详细信息,请访问 http://go.microsoft.com/fwlink/?LinkId=279712。
//config.EnableQuerySupport();
// 若要在应用程序中禁用跟踪,请注释掉或删除以下代码行
// 有关详细信息,请参阅: http://www.asp.net/web-api
config.EnableSystemDiagnosticsTracing();
}
3.2 为控制器添加[EnableCors]属性代码:[EnableCors(origins: "*", headers: "*", methods: "*")]
/*
* origins: "*",*是允许所有域名,可以指定只有特定域名,如* origins: "http://www.baidi.com"
*/
[EnableCors(origins: "*", headers: "*", methods: "*")]
public JsonResult Get()
{
return new JsonResult { Data = new { Status = 1 } };
}
3.3.服务端配置完成后,先运行项目看看,大多数情况下都会报错,至少我是这样子。此时一般错误都是:
XXX类型初始值设定项引发异常。
XXX接口缺少缺少实现。
XXX透明方法XXX等。
这时,在程序包管理器控制台输入命令:Update-Package Microsoft.AspNet.WebApi -Pre
等更新执行完成后,再实现一下接口,服务端就大功告成了。
4.前端调用
<script type="text/javascript">
var url = "http://localhost:59377/api/values/";
$.ajax({
type: "get",
url: url,
dataType: 'json',
success: function(json) {
var resultstatus = json.Data.Status;
if (resultstatus == 1) {
alert("成功");
} else if (resultstatus == 0) {
alert("失败");
}
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
alert(XMLHttpRequest.readyState + XMLHttpRequest.status + XMLHttpRequest.responseText);
}
});
</script>
分享是一件快乐的事;