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