专栏首页c#开发者让web api 4.5支持Jquery.getJson(url,handle)跨域访问

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

                    });
                });
        });

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • BizTalk Orchestration execute Flat file disassembler ReceivePipeline

    需求是这样,在一个inbound XML中有个一点节点使用平文件的方式存放,还要解析比如固定长度或根据特殊字符截取字段 也就是需要在流程里面先把输入的XML的节...

    阿新
  • 为什么nhibernate 不能保存on-to-many的结构

    下面是主类文件 Code namespace EasyTalk.Module {     /// <summary>     /// SiteAddre...

    阿新
  • C# : row-clickable GridView and get and set gridview rows using JavaScript

    Complete C# code: ---------------- using System; using System.ComponentModel; ...

    阿新
  • Unity使用AssetImporter整理资源对其进行打包

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明...

    bering
  • C#命令行解析工具

    第一个方法是不需要安装任何的库,这个方法是性能很高,但是封装不好。第二个方法是使用 CommandLineParser 库,这个库提高很好的封装但是性能会比较差...

    林德熙
  • leetcode-345-Reverse Vowels of a String

    chenjx85
  • 实体类的变形【2】—— 行列转换

        上次说了一下在网页里面显示列表数据的情况,这个应用范围太小了,添加、修改怎么办呢?网站的后台管理、OA、CRM等怎么办?还是这样处理显然是不行的。...

    用户1174620
  • Elasticsearch(2)PHP驱动

    安装完成composer之后。我们需要安装php的类库来对Elasticsearch进行连接。

    魔王卷子
  • RSA的java实现

    东营浪人
  • WebAPi的可视化输出模式(RabbitMQ、消息补偿相关)——所有webapi似乎都缺失的一个功能

    最近的工作我在做一个有关于消息发送和接受封装工作。大概流程是这样的,消息中间件是采用rabbitmq,为了保证消息的绝对无丢失,我们需要在发送和接受前对消息进行...

    王清培

扫码关注云+社区

领取腾讯云代金券