ASP.NET рд╡реЗрдм рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП JSONP рдлреЙрд░реНрдореЗрдЯрд░

рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ ASP.NET рд╡реЗрдм рдПрдкреАрдЖрдИ рдореЗрдВ JSONP рдлреЙрд░реНрдореИрдЯрд░ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рдмрдирд╛рдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред

рд╣рдореЗрдВ JSONP рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ


JSONP рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕рд░реНрд╡рд░ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдЬрд╣рд╛рдВ рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред JSONP рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ JSON рдбреЗрдЯрд╛ рд▓рдкреЗрдЯрддрд╛ рд╣реИ рдЬреЛ рд╕рд░реНрд╡рд░ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИред рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рдВрд╕рд╛рдзрди рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, RemoteDomain/aspnetWebApi/albums RemoteDomain/aspnetWebApi/albums , рдЬреЛ рд╣рдореЗрдВ GET рдЕрдиреБрд░реЛрдз рдкрд░ рдПрд▓реНрдмрдореЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рджреЗрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╕реВрдЪреА рдХреЛ JSONP рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдХреИрд╕реЗ рджрд┐рдпрд╛ рдЬрд╛рдПред JQuery рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 function getAlbums() { $.getJSON("http://remotedomain/aspnetWebApi/albums?callback=?", null, function (albums) { alert(albums.length); }); } 

JSONP рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ


JSONP рдПрдХ рдХрд╛рдлреА рд╕рд░рд▓ "рдкреНрд░реЛрдЯреЛрдХреЙрд▓" рд╣реИред рд╡рд╣ рдЬреЛ рдХреБрдЫ рднреА рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ JSON рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рд▓рдкреЗрдЯрддрд╛ рд╣реИред рдЙрдкрд░реЛрдХреНрдд рдХреНрд╡реЗрд░реА рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдХреБрдЫ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

Query17103401925975181569_1333408916499( [{"Id":"34043957","AlbumName":"Dirty Deeds Done Dirt Cheap",тАж},{тАж}] )

jQuery рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИ, рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ "рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ", JSON рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИред

JSONP рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ


рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ JSONP рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рд╢реБрджреНрдз рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рджреВрдВрдЧрд╛:

 function jsonp(url, callback) { //    var id = "_" + (new Date()).getTime(); //    window[id] = function (result) { //    if (callback) callback(result); // :     var sc = document.getElementById(id); sc.parentNode.removeChild(sc); window[id] = null; } url = url.replace("callback=?", "callback=" + id); //   <script>,   JSONP- //   ,   window[id] var script = document.createElement("script"); script.setAttribute("id", id); script.setAttribute("src", url); script.setAttribute("type", "text/javascript"); document.body.appendChild(script); } 

рдкрд┐рдЫрд▓реЗ jQuery рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рдорд╛рди, рд╣рдо рдПрд▓реНрдмрдо рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:

 function getAlbumsManual() { jsonp("http://remotedomain/aspnetWebApi/albums?callback=?", function (albums) { alert(albums.length); }); } 

JSONP рдФрд░ ASP.NET рд╡реЗрдм рдПрдкреАрдЖрдИ


рдЬреИрд╕рд╛ рдХрд┐ рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, ASP.NET рд╡реЗрдм рдПрдкреАрдЖрдИ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ JSONP рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ JSONP рдлреЙрд░реНрдореИрдЯрд░ рдмрдирд╛рдирд╛ рдФрд░ рдЗрд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред

рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рдХреНрд░рд┐рд╢реНрдЪрд┐рдпрди рд╡рд┐рдпрд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдХреЛрдб рдХреЛ рдирд╡реАрдирддрдо рд╡реЗрдм рдПрдкреАрдЖрдИ рдЖрд░рдЯреАрдПрдо рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╖реНрдХреГрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

 using System; using System.IO; using System.Net; using System.Net.Http.Formatting; using System.Net.Http.Headers; using System.Threading.Tasks; using System.Web; using System.Net.Http; using Newtonsoft.Json.Converters; using System.Web.Http; namespace Westwind.Web.WebApi { /// <summary> /// Handles JsonP requests when requests are fired with text/javascript /// </summary> public class JsonpFormatter : JsonMediaTypeFormatter { public JsonpFormatter() { SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json")); SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/javascript")); JsonpParameterName = "callback"; } /// <summary> /// Name of the query string parameter to look for /// the jsonp function name /// </summary> public string JsonpParameterName {get; set; } /// <summary> /// Captured name of the Jsonp function that the JSON call /// is wrapped in. Set in GetPerRequestFormatter Instance /// </summary> private string JsonpCallbackFunction; public override bool CanWriteType(Type type) { return true; } /// <summary> /// Override this method to capture the Request object /// </summary> /// <param name="type"></param> /// <param name="request"></param> /// <param name="mediaType"></param> /// <returns></returns> public override MediaTypeFormatter GetPerRequestFormatterInstance(Type type, System.Net.Http.HttpRequestMessage request, MediaTypeHeaderValue mediaType) { var formatter = new JsonpFormatter() { JsonpCallbackFunction = GetJsonCallbackFunction(request) }; // this doesn't work unfortunately //formatter.SerializerSettings = GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings; // You have to reapply any JSON.NET default serializer Customizations here formatter.SerializerSettings.Converters.Add(new StringEnumConverter()); formatter.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented; return formatter; } public override Task WriteToStreamAsync(Type type, object value, Stream stream, HttpContent content, TransportContext transportContext) { if (string.IsNullOrEmpty(JsonpCallbackFunction)) return base.WriteToStreamAsync(type, value, stream, content, transportContext); StreamWriter writer = null; // write the pre-amble try { writer = new StreamWriter(stream); writer.Write(JsonpCallbackFunction + "("); writer.Flush(); } catch (Exception ex) { try { if (writer != null) writer.Dispose(); } catch { } var tcs = new TaskCompletionSource<object>(); tcs.SetException(ex); return tcs.Task; } return base.WriteToStreamAsync(type, value, stream, content, transportContext) .ContinueWith( innerTask => { if (innerTask.Status == TaskStatus.RanToCompletion) { writer.Write(")"); writer.Flush(); } },TaskContinuationOptions.ExecuteSynchronously) .ContinueWith( innerTask => { writer.Dispose(); return innerTask; },TaskContinuationOptions.ExecuteSynchronously) .Unwrap(); } /// <summary> /// Retrieves the Jsonp Callback function /// from the query string /// </summary> /// <returns></returns> private string GetJsonCallbackFunction(HttpRequestMessage request) { if (request.Method != HttpMethod.Get) return null; var query = HttpUtility.ParseQueryString(request.RequestUri.Query); var queryVal = query[this.JsonpParameterName]; if (string.IsNullOrEmpty(queryVal)) return null; return queryVal; } } } 

рдореИрдВ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХреЛрдб рд╡реЗрдм рдПрдкреАрдЖрдИ рдХреЗ рдмреАрдЯрд╛ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛; рдпрд╣ рдХреЗрд╡рд▓ RTM рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рднреА рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЬрдм рдЖрдк рдЗрд╕ JSONP рдлреЙрд░реНрдореИрдЯрд░ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрдЯреЙрдХ JSON рдлреЙрд░реНрдореИрдЯрд░ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрд╕реА MIME рдкреНрд░рдХрд╛рд░ рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХреЛрдб рдЕрднреА рднреА рд╕реНрдЯреЙрдХ JSON рдлреЙрд░реНрдореЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдкреНрд░рд╛рд░рдВрдн рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рддреНрдпреЗрдХ JSON рдпрд╛ JSONP рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдкрдХреЛ рдХреБрдЫ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП JSON GetPerRequestFormatterInstance() рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ GetPerRequestFormatterInstance() рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдХреЗ рдЗрд╕ рдХреЛрдб рдореЗрдВ рдРрд╕рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

JSONP рдлреЙрд░реНрдореЗрдЯрд░ рдХрдиреЗрдХреНрд╢рди


JSONP рдлреЙрд░реНрдореИрдЯрд░ рдХреЛ Global_as.l рдлрд╝рд╛рдЗрд▓ рдХреЗ Application_Start() рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдлрд╝реЙрд░реНрдореИрдЯрд░ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдЬреЛрдбрд╝рдХрд░ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ

 protected void Application_Start(object sender, EventArgs e) { //   GlobalConfiguration .Configuration .Formatters .Insert(0, new Westwind.Web.WebApi.JsonpFormatter()); } 

рд╡рд╣ рд╕рдм рд╣реИред

рдиреЛрдЯред рдореИрдВрдиреЗ рд╕рднреА рдХреЗ рд╕рд╛рдордиреЗ рдПрдХ JSONP рдлреЙрд░реНрдореИрдЯрд░ рдЬреЛрдбрд╝рд╛ред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ JSON рдлреЙрд░реНрдореЗрдЯрд░ рдХреЛ рд╕реНрдЯреЙрдХ JSON рдлреЙрд░реНрдореЗрдЯрд░ рд╕реЗ рдкрд╣рд▓реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЕрдиреНрдпрдерд╛ рдЗрд╕реЗ рдХрднреА рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред

GitHub рд╕реНрд░реЛрдд рдХреЛрдб

рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдореБрдлреНрдд рдЕрдиреБрд╡рд╛рдж рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХрд╛рдиреЛрдВ рдореЗрдВ рд╕рднреА рдердкреНрдкрдбрд╝, рдХреГрдкрдпрд╛, рдкреАрдПрдо рдореЗрдВред рдХрдИ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рд╕рд╛рд░ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднреВрдорд┐рдХрд╛ рдирд╣реАрдВ рдирд┐рднрд╛рдИ рд╣реИред рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдХреГрдкрдпрд╛ рдореВрд▓ рдХреЛ рджреЗрдЦреЗрдВред

рд╡реЗрдм API RTM рдореЗрдВ, рдПрдХ WriteToStreamAsync() рдореЗрдВ WriteToStreamAsync() рд╡рд┐рдзрд┐ рд╡реЗрдм API RC рдореЗрдВ рднрд┐рдиреНрди рд╣реЛрддреА рд╣реИ: рдкрд╣рд▓реЗ HttpContent рдореЗрдВ, рджреВрд╕рд░реЗ рдореЗрдВ - HttpContentHeader ред

рдореИрдВрдиреЗ ApiConfig.cs рдлрд╝рд╛рдЗрд▓ рдореЗрдВ JSON ApiConfig.cs рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛:

ApiConfig.cs

 public static void RegisterApiConfigure(HttpConfiguration config) { // Remove the JSON formatter //config.Formatters.Remove(config.Formatters.JsonFormatter); // Remove the XML formatter config.Formatters.Remove(config.Formatters.XmlFormatter); // Indenting //config.Formatters.JsonFormatter.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented; // Add a custom JsopFormatter config.Formatters.Insert(0, new JsonpFormatter()); } 

Global.asax.cs

 protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); ApiConfig.RegisterApiConfigure(GlobalConfiguration.Configuration); } 

Source: https://habr.com/ru/post/In150495/


All Articles