让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");
 
                    });
                });
        });

  

posted @   阿新  阅读(1567)  评论(1编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· 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
点击右上角即可分享
微信分享提示