前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >让web api 4.5支持Jquery.getJson(url,handle)跨域访问

让web api 4.5支持Jquery.getJson(url,handle)跨域访问

作者头像
阿新
发布2018-04-12 14:49:22
6720
发布2018-04-12 14:49:22
举报
文章被收录于专栏:c#开发者c#开发者

代码片段,google了半天,找到的都是4.5 rc,或之前版本的代码,发现都不能用,正式版后有些方法做了修改。我重新修改一下分享给大家

代码语言:javascript
复制
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);
        }
    } 
代码语言:javascript
复制
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());
代码语言:javascript
复制
$('#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");

                    });
                });
        });
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2013-01-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档