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, value, stream, content, 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