zoukankan      html  css  js  c++  java
  • WebApi,WebNet 接收Jsonp

    本随笔为文章转载,勿笑

    第一步:

    创建JsonpMediaTypeFormatter 

     public class JsonpMediaTypeFormatter : JsonMediaTypeFormatter
        {
            public string Callback { get; private set; }
    
            public JsonpMediaTypeFormatter(string callback = null)
            {
                this.Callback = callback;
            }
    
            public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content, TransportContext transportContext)
            {
                if (string.IsNullOrEmpty(this.Callback))
                {
                    return base.WriteToStreamAsync(type, value, writeStream, content, transportContext);
                }
                try
                {
                    this.WriteToStream(type, value, writeStream, content);
                    return Task.FromResult<AsyncVoid>(new AsyncVoid());
                }
                catch (Exception exception)
                {
                    TaskCompletionSource<AsyncVoid> source = new TaskCompletionSource<AsyncVoid>();
                    source.SetException(exception);
                    return source.Task;
                }
            }
    
            private void WriteToStream(Type type, object value, Stream writeStream, HttpContent content)
            {
                JsonSerializer serializer = JsonSerializer.Create(this.SerializerSettings);
                using (StreamWriter streamWriter = new StreamWriter(writeStream, this.SupportedEncodings.First()))
                using (JsonTextWriter jsonTextWriter = new JsonTextWriter(streamWriter) { CloseOutput = false })
                {
                    jsonTextWriter.WriteRaw(this.Callback + "(");
                    serializer.Serialize(jsonTextWriter, value);
                    jsonTextWriter.WriteRaw(")");
                }
            }
    
            public override MediaTypeFormatter GetPerRequestFormatterInstance(Type type, HttpRequestMessage request, MediaTypeHeaderValue mediaType)
            {
                if (request.Method != HttpMethod.Get)
                {
                    return this;
                }
                string callback;
                if (request.GetQueryNameValuePairs().ToDictionary(pair => pair.Key,
                     pair => pair.Value).TryGetValue("callback", out callback))
                {
                    return new JsonpMediaTypeFormatter(callback);
                }
                return this;
            }
    
            [StructLayout(LayoutKind.Sequential, Size = 1)]
            private struct AsyncVoid
            { }
        }

    第二步:

    Global.asax添加以下代码

    protected void Application_Start()
            {
           //返回Json时使用 GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
    //设置Jsonp格式序列化方法 GlobalConfiguration.Configuration.Formatters.Insert(0, new JsonpMediaTypeFormatter()); AreaRegistration.RegisterAllAreas(); GlobalConfiguration.Configure(WebApiConfig.Register); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); }
  • 相关阅读:
    [记录]Python2.7使用argparse模块
    [记录]MySQL读写分离(Atlas和MySQL-proxy)
    [记录]Shell中的getopts和getopt用法
    [记录]CentOS搭建SVN服务器(主从同步)
    [记录]Zabbix3.4配置监控Oracle12c的存活状态和表空间使用率
    [记录]一则清理MySQL大表以释放磁盘空间的案例
    [原创]Oracle 12c的备份和恢复策略
    Linux awk用法
    Oracle数据库学习笔记
    oracle无法删除当前连接用户方法
  • 原文地址:https://www.cnblogs.com/OleRookie/p/5721000.html
Copyright © 2011-2022 走看看