让web api 4.5支持Jquery.getJson(url,handle)跨域访问
代码片段,google了半天,找到的都是4.5 rc,或之前版本的代码,发现都不能用,正式版后有些方法做了修改。我重新修改一下分享给大家
public static class HttpRequestMessageExtensions { public static string QueryString( this HttpRequestMessage request, string name) { string requestUri = request.RequestUri.Query; string [] queries = requestUri.Split( '&' ); foreach ( string s in queries) { if (s.Contains(name)) { int index = s.IndexOf( '=' ); int stopIndex = s.IndexOf( '&' , index); if (stopIndex != -1) return s.Substring(index + 1, stopIndex - index - 1); else return s.Substring(index + 1, s.Length - index - 1); } } return string .Empty; } } public class JsonpMediaTypeFormatter : JsonMediaTypeFormatter { private string callbackQueryParameter; private HttpRequestMessage httpRequest; 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 MediaTypeFormatter GetPerRequestFormatterInstance(Type type, HttpRequestMessage request, MediaTypeHeaderValue mediaType) { httpRequest = request; return base .GetPerRequestFormatterInstance(type, request, mediaType); } 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") if (httpRequest.Method!=HttpMethod.Get) return false ; //var uri = httpRequest.RequestUri; //var query = uri.Query; callback = httpRequest.QueryString(CallbackQueryParameter); return ! string .IsNullOrEmpty(callback); } } |
var config = new HttpSelfHostConfiguration(baseAddress); // Set the max message size to 1M instead of the default size of 64k and also // set the transfer mode to 'streamed' so that don't allocate a 1M buffer but // rather just have a small read buffer. config.MaxReceivedMessageSize = 1024 * 1024; config.TransferMode = TransferMode.Streamed; config.Formatters.Insert(0, new JsonpMediaTypeFormatter()); |
$( '#getjson' ).bind( 'click' , function () { $.getJSON( "http://192.168.103.135:8080/api/products/1?jsoncallback=?" , function (data) { $( "#result" ).append(data); return ; $( "#result" ).append(data.Image); $( "<img/>" ).attr( "src" , "data:image/jpeg;base64," + data.Image).appendTo( "#result" ); return ; $.each(data, function (i, item) { $( "#result" ).append(item.Name); $( "<img/>" ).attr( "src" , item.Image).appendTo( "#result" ); }); }); }); |
分类:
.net
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix