asp.net web api2.0 ajax跨域解决方案

Web Api的优缺点就不说了,直接说怎么跨域,我搜了一下,主要是有两种。

 一,ASP.NET Web API支持JSONP,分两种

  1,利用JsonMediaTypeFormatter,具体参考这里:http://www.cnblogs.com/artech/p/cors-4-asp-net-web-api-03.html

上代码:

新建JsonpMediaTypeFormatter类:

    public class JsonpMediaTypeFormatter : JsonMediaTypeFormatter
    {

        private string callbackQueryParameter;

        public JsonpMediaTypeFormatter()
        {
            SupportedMediaTypes.Add(DefaultMediaType);
            SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/javascript"));

            MediaTypeMappings.Add(new UriPathExtensionMapping("jsonp", DefaultMediaType));
        }

        public string CallbackQueryParameter
        {
            get { return callbackQueryParameter ?? "callback"; }
            set { callbackQueryParameter = value; }
        }

        /// <summary>
        /// 将对象序列化后的JSON字符串填充到JavaScript回调函数中
        /// </summary>
        /// <param name="type"></param>
        /// <param name="value"></param>
        /// <param name="stream"></param>
        /// <param name="content"></param>
        /// <param name="transportContext"></param>
        /// <returns></returns>
        public override Task WriteToStreamAsync(Type type, object value, Stream stream, HttpContent content, TransportContext transportContext)
        {
            string callback;

            if (IsJsonpRequest(out callback))
            {
                return Task.Factory.StartNew(() =>
                {
                    var writer = new StreamWriter(stream);
                    writer.Write(callback + "(");
                    writer.Flush();

                    base.WriteToStreamAsync(type, value, stream, content, transportContext).Wait();

                    writer.Write(")");
                    writer.Flush();
                });
            }
            else
            {
                return base.WriteToStreamAsync(type, value, stream, content, transportContext);
            }
        }

        /// <summary>
        /// 判断是否为跨域请求
        /// </summary>
        /// <param name="callback"></param>
        /// <returns></returns>
        private bool IsJsonpRequest(out string callback)
        {
            callback = null;

            if (HttpContext.Current.Request.HttpMethod != "GET")
                return false;

            callback = HttpContext.Current.Request.QueryString[CallbackQueryParameter];

            return !string.IsNullOrEmpty(callback);
        }
    }
  • 在Global.asax中注册JsonpMediaTypeFormatter
  • GlobalConfiguration.Configuration.Formatters.Insert(0, new JsonpMediaTypeFormatter());

      2,利用ActionFilterAttribute ,具体参考这里:http://stackoverflow.com/questions/9421312/jsonp-with-asp-net-web-api/18206518#18206518

      代码:

    新建 JsonCallbackAttribute 类

        public class JsonCallbackAttribute : ActionFilterAttribute
        {
            private const string CallbackQueryParameter = "callback";
    
            public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
            {
                var callback = string.Empty;
                if (IsJosnp(out callback))
                {
                    var jsonBuilder = new StringBuilder(callback);
                    jsonBuilder.AppendFormat("({0})", actionExecutedContext.Response.Content.ReadAsStringAsync().Result);
                    actionExecutedContext.Response.Content = new StringContent("C(\"a\")");
                }
                base.OnActionExecuted(actionExecutedContext);
            }
    
            private bool IsJosnp(out string callback)
            {
                callback = System.Web.HttpContext.Current.Request.QueryString[CallbackQueryParameter];
                return !string.IsNullOrEmpty(callback);
            }
    
        }

    在Global.asax中注册JsonCallbackAttribute

    GlobalConfiguration.Configuration.Filters.Add(new JsonCallbackAttribute());

     二,使用 Microsoft ASP.NET Web API 2 Cross-Origin Suppor

      使用 NuGe 安装 Microsoft ASP.NET Web API 2 Cross-Origin Support,这里说的很详细

      然后在Global.asax中开启针对CORS的支持,EnableCors加不加无影响的样子。

    测试实例:

    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <script src="http://cdn.bootcss.com/jquery/2.1.3/jquery.min.js"></script>
        <title>测试 WebApi 跨域</title>
    </head>
    <body>
        <form id="form1" runat="server">
            <input type="button" id="btnGet" value="Get 点击跨域查询数据" />
            <div id="bindData">
            </div>
            <input type="button" id="btnPost" value="Post 点击跨域查询数据" />
        </form>
        <script>
            $(‘#btnGet‘).bind(‘click‘, function (e) {
                $.ajax({
                    type: "GET",
                    url: "http://localhost:20128/api/UserInfo",
                    success: function (data) {
                        var html = "";
                        $.each(data, function (index, val) {
                            html += "<ul><li>GroupName: " + val.Id + " -- " + val.Name + "</li></ul>";
                        });
                        $("#bindData").append(html);
                    }
                });
            });
    
            $(‘#btnPost‘).bind(‘click‘, function (e) {
                var user = { Id: ‘1‘, Name: ‘233‘ };
                $.ajax({
                    type: "POST",
                    contentType: ‘application/json; charset=utf-8‘,
                    data: JSON.stringify(user),
                    url: "http://localhost:20128/api/UserInfo",
                    success: function (data) {
                        //var html = "";
                        //$.each(data, function (index, val) {
                        //    html += "<ul><li>GroupName: " + val.Id + " -- " + val.Name + "</li></ul>";
                        //});
                        //$("#bindData").append(html);
                    }
                });
            });
    
        </script>
    </body>
    </html>

    Ajax请求在Post数据的时候,一定要加上这样项:

    contentType: ‘application/json; charset=utf-8‘,
    
    data: JSON.stringify(user),

    就这样,只是把网络上有解决方案的整理了一下,放在了一切。

    时间: 2024-08-28 01:58:21

    asp.net web api2.0 ajax跨域解决方案的相关文章

    AJAX跨域解决方案

    从AJAX诞生那天起,XMLHttprequest对象不能跨域请求的问题就一直存在,这似乎是一个很经典的问题了,是由于javascript的同源策略所导致. 解决的办法,大概有如下几种: 1. 使用中间层过渡的方式(可以理解为“代理”) 中间过渡,就是在AJAX与不同域的服务器进行通讯的中间加一层过渡,这一层过渡可以是PHP.JSP.c++等任何具备网络通讯功能的语言,由中间层向不同域的服务器进行读取数据的操作.拿asp.net做一个例子,如果需要对不同域的某一个asp.net进行通讯,现在客户

    ajax 跨域解决方案

    有的浏览器不支持跨域访问,为ie8. 那么我们可以通过重新构造一个新的可以url来支持跨域获取资源,代码如下. var url = forexample.test.com.cn; if (!$.support.cors) { var start = url.indexOf('.test.com.cn') + 12; //12 为 ".test.com.cn"的长度. var callName = url.substring(start); proxyUrl = url.substrin

    ajax跨域解决方案(服务端仅限java)

    楼主前端知识菜鸟,高手勿喷,在此记录工作中遇到的问题及解决方案,大神请滤过 1.jsonp(js客户端ajax请求参数方式设置) 2.服务端接口设置: HttpServletResponse 对象: setHeader("Access-Control-Allow-Origin", "*");

    web api 跨域请求,ajax跨域调用webapi

    1.跨域问题仅仅发生在Javascript发起AJAX调用,或者Silverlight发起服务调用时,其根本原因是因为浏览器对于这两种请求,所给予的权限是较低的,通常只允许调用本域中的资源,除非目标服务器明确地告知它允许跨域调用.假设我们页面或者应用已在 http://www.test1.com 上了,而我们打算从 http://www.test2.com 请求提取数据.一般情况下,如果我们直接使用 AJAX 来请求将会失败,浏览器也会返回“源不匹配”的错误,"跨域"也就以此由来. 2

    Web Api 2(Cors)Ajax跨域访问

    支持Ajax跨域访问ASP.NET Web Api 2(Cors)的简单示例教程演示 随着深入使用ASP.NET Web Api,我们可能会在项目中考虑将前端的业务分得更细.比如前端项目使用Angularjs的框架来做UI,而数据则由另一个Web Api 的网站项目来支撑.注意,这里是两个Web网站项目了,前端项目主要负责界面的呈现和一些前端的相应业务逻辑处理,而Web Api则负责提供数据. 这样问题就来了,如果前端通过ajax访问Web Api项目话,就涉及到跨域了.我们知道,如果直接访问,

    ASP.NET MVC 实现AJAX跨域请求的两种方法

    通常发送AJAX请求都是在本域内完成的,也就是向本域内的某个URL发送请求,完成部分页面的刷新.但有的时候需要向其它域发送AJAX请求,完成数据的加载,例如Google. 在ASP.NET MVC 框架里实现跨域的AJAX请求有几种方式可以实现,以下就介绍常用的两种方法. 1.     发送JSONP请求 客户端: JQuery对发送JSONP请求有很好的支持,客户端通过. ajax() 函数发送请求,其中需要制定 dataType 为“jsonp”  jsonpCallback 为指定的回调函

    ASP.NET MVC 实现AJAX跨域请求方法《1》

    ASP.NET MVC 实现AJAX跨域请求的两种方法 通常发送AJAX请求都是在本域内完成的,也就是向本域内的某个URL发送请求,完成部分页面的刷新.但有的时候需要向其它域发送AJAX请求,完成数据的加载,例如Google. 在ASP.Net MVC 框架里实现跨域的AJAX请求有几种方式可以实现,以下就介绍常用的两种方法. 1.     发送JSONP请求 客户端: jQuery对发送JSONP请求有很好的支持,客户端通过. ajax() 函数发送请求,其中需要制定 dataType 为"j

    ASP.NET MVC 实现 AJAX 跨域请求

    ASP.NET MVC 实现AJAX跨域请求的两种方法 和大家分享下Ajax 跨域的经验,之前也找了好多资料,但是都不行,后来看到个可行的修改了并测试下 果然OK了   希望对大家有所帮助! 通常发送AJAX请求都是在本域内完成的,也就是向本域内的某个URL发送请求,完成部分页面的刷新.但有的时候需要向其它域发送AJAX请求,完成数据的加载,例如Google. 在ASP.NET MVC 框架里实现跨域的AJAX请求有几种方式可以实现,以下就介绍常用的两种方法. 1.     发送JSONP请求

    $.ajax 跨域请求 Web Api

    WepApi确实方便好用,没有配置文件,一个apicontroller直接可以干活了.但今天用$.ajax跨域请求的时候总是获取不到数据,用fiddler一看确实抓到了数据,但回到$.ajax函数中,直接触发了error,没有触发success,即使状态码是200.用apiclient或者浏览器直接访问都是ok的.搜罗一番.最终在这篇文章上面找到答案 .http://code.msdn.microsoft.com/windowsdesktop/Implementing-CORS-support-