zoukankan      html  css  js  c++  java
  • 让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");
    
                        });
                    });
            });
    

      

  • 相关阅读:
    thinkphp 关联
    php io
    phpstorm 生产php pojo类
    解决在mysql表中删除自增id数据后,再添加数据时,id不会自增1的问题
    thinkphp model
    thinkphp 数据库连接报错 SQLSTATE[HY000] [2002] No such file or directory
    thinkphp获取目录的方法
    thinkphp数据库连接
    css3背景颜色渐变属性
    CentOS开机自动运行自己的脚本详解
  • 原文地址:https://www.cnblogs.com/neozhu/p/2848795.html
Copyright © 2011-2022 走看看