zoukankan      html  css  js  c++  java
  • Ajax支持跨域之Web API实现

    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>

    分享是一件快乐的事;

  • 相关阅读:
    2016"百度之星"
    ZOJ 3703 Happy Programming Contest(01背包的灵活运用)
    LA 3942 Remember the Word (Trie树)
    ZOJ 3700 Ever Dream(Vector)
    Hdoj 1686 Oulipo
    2017总结,2018计划
    Ubuntu16.04 + caffe-ssd + [CPU_ONLY] + KITTI 训练总结
    【转载】The Elements of Programming Style之代码风格金科玉律
    qt中setStyleSheet导致的内存泄漏
    【转】用枚举定义有意义的数组下标
  • 原文地址:https://www.cnblogs.com/jrsnd/p/4832865.html
Copyright © 2011-2022 走看看