Mvc4 WebApi 支持jsonp

前端之家收集整理的这篇文章主要介绍了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

猜你在找的Json相关文章