Mvc4 WebApi 支持jsonp



JsonpMediaTypeFormatter.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Net.Http.Formatting;
using System.IO;

using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using System.Net;

namespace BitAuto.PeopleLib.Api.Formatters
{
    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; }
        }

        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,transportContext);
            }
        }


        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

var config = GlobalConfiguration.Configuration;
config.Formatters.Insert(0,new JsonpMediaTypeFormatter());

前台访问

  function getAll() {
        $.ajax({
            url: "http://localhost:37980/api/people/List",type: 'GET',dataType: "jsonp",success: function (data) {
                var s = "";
                $.each(data,function (i,val) {
                    s += val.Name;
                });

                $("#modes").html(s);

            }
        }).fail(
             function (xhr,textStatus,err) {
                 alert('Error: ' + err);
             });
    }
 
dataType:用jsonp

相关文章

AJAX是一种基于JavaScript和XML的技术,能够使网页实现异步交...
在网页开发中,我们常常需要通过Ajax从后端获取数据并在页面...
在前端开发中,经常需要循环JSON对象数组进行数据操作。使用...
AJAX(Asynchronous JavaScript and XML)是一种用于创建 We...
AJAX技术被广泛应用于现代Web开发,它可以在无需重新加载页面...
Ajax是一种通过JavaScript和HTTP请求交互的技术,可以实现无...