代码来自《ASP.NET Web API 2 框架揭秘》一书。

  直接上代码:

  

 /// <summary>
/// 自定义jsonp MediaType
/// </summary>
public class JsonpMediaTypeFormatter : JsonMediaTypeFormatter
{
//callback参数
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)
{
//如果callback不存在,直接调用父类方法
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 ex)
{
TaskCompletionSource<AsyncVoid> source = new TaskCompletionSource<AsyncVoid>();
source.SetException(ex);
return source.Task;
}
} private void WriteToStream(Type type, object value, Stream writeStream, HttpContent content)
{
JsonSerializer serializer = JsonSerializer.Create(this.SerializerSettings);
using (StreamWriter writer = new StreamWriter(writeStream,this.SupportedEncodings.First())) {
using (JsonTextWriter jsonTextWriter = new JsonTextWriter(writer) { CloseOutput = false }) {
//添加callback(json)
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(p => p.Key, p => p.Value).TryGetValue("callback", out callback)) {
return new JsonpMediaTypeFormatter(callback);
}
return this;
} [StructLayout(LayoutKind.Sequential, Size = )]
private struct AsyncVoid { }
}

  然后在Global.asax中将JsonpMediaTypeFormatter加入

  

 protected void Application_Start()
{
//加入jsonpMediaTypeFormatter
GlobalConfiguration.Configuration.Formatters.Insert(, new JsonpMediaTypeFormatter());
AreaRegistration.RegisterAllAreas(); GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}

  Demo演示:

  我在localhost:55950 用jquery 调用api(http://localhost:55599/api/search?key=%E7%83%A7%E7%81%AB&from=0&size=10)

  

  得到结果如图:

  

  成功调用。不过书上说,这种方法仅限于get方法。

  OK,笔记完成,记录下来以防以后 用到可以参考参考。

ASP.NET Web API 自定义MediaType实现jsonp跨域调用的更多相关文章

  1. Asp.Net Web Api 接口,拥抱支持跨域访问。

    如何让你的 Asp.Net Web Api 接口,拥抱支持跨域访问. 由于 web api 项目通常是被做成了一个独立站点,来提供数据,在做web api 项目的时候,不免前端会遇到跨域访问接口的问题 ...

  2. 如何让你的 Asp.Net Web Api 接口,拥抱支持跨域访问。

    由于 web api 项目通常是被做成了一个独立站点,来提供数据,在做web api 项目的时候,不免前端会遇到跨域访问接口的问题. 刚开始没做任何处理,用jsonp的方式调用 web api 接口, ...

  3. Web API中使用CORS解决跨域

    Web API中使用Cros解决跨域 如果两个页面的协议,端口和域名都相同,则两个页面具有相同的源,注:IE不考虑端口,同源策略不会阻止浏览器发送请求,但是它会阻止应用程序看到响应.如下图所示 COR ...

  4. jsonP跨域调用

    -------------------------------------jsonP跨域调用------------------------------------- <div class=&q ...

  5. jquery中的jsonp跨域调用

                                                    jquery jsonp跨域调用接口

  6. jquery中的jsonp跨域调用(接口)

                                                                           jquery jsonp跨域调用接口

  7. .NET MVC & Web API Cors让AJAX 实现跨域

    什么是Cors? CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing).它允许浏览器向跨源服务器,发出XMLHttpReq ...

  8. 在dotnet core web api中支持CORS(跨域访问)

    最近在写的Office add-in开发系列中,其中有一个比较共性的问题就是在add-in的客户端脚本中访问远程服务时,要特别注意跨域访问的问题. 关于CORS的一些基本知识,请参考维基百科的说明:h ...

  9. jquery ajax jsonp跨域调用实例代码

    今天研究了AJAX使用JSONP进行跨域调用的方法,发现使用GET方式和POST方式都可以进行跨域调用,这里简单分享下,方便需要的朋友 客户端代码 复制代码 代码如下: <%@ Page Lan ...

随机推荐

  1. (转)Shell中获取字符串长度的七种方法

    Shell中获取字符串长度的七种方法 原文:http://blog.csdn.net/jerry_1126/article/details/51835119 求字符串操作在shell脚本中很常用,下面 ...

  2. 第二十一章:deploy and live updates

    通常我们开发一个app之后,需要把他们放到对应的应用商店上去以供下载.在此期间,需要经过应用商店的审核,包括初次上传和更新上传.短则需要数天,多则需要几个星期,这对于我们的快速产品迭代和hotfix来 ...

  3. HTML的注释方式对JSP的JSTL不管用

    <fmt:parseNumber var="y" integerOnly="true" type="number" value=&qu ...

  4. ubuntu遇到了 dpkg was interrupted, you must manually run 'dpkg..的问题

    dpkg was interrupted, you must manually run 'dpkg --configure -a' to correct the problem. E: _cache- ...

  5. JavaScript基础(String)

    字符串 String 1.连接字符串 数字与字符串相加,为字符串 9+"9"; 2.字符串的长度 "abc".length; 3.从字符串中获取单个字符(索引下 ...

  6. MVC类库视图在UI使用方法

    在类库中固定文件:Controller Views  引用一下两个程序集(类库和UI项目都需要引用)(似乎只需要引用mvc的,build似乎在引用文件中不见了?有空测试一下) 如此方式,一个登录需要是 ...

  7. VueConf 全球首届Vue.js开发者大会资料整理

    最近一直关注VueConf全球首届Vue.js开发者大会,现在将此次开发者大会资料整理如下: 一.Vue 2017 现状与展望   [尤雨溪] 在线视频: PPT整理: Vue 2017 现状与展望 ...

  8. (0!=0)==true? 记一个匪夷所思的问题

    最近换了份工作,公司的开发框架是基于SSH自己搭建的.这个问题是我在解决一个需求的时候遇到的,其实解决这个疑惑的过程也就是读框架源码的过程,特此记录一下. 问题:ba.getState()!=CbBa ...

  9. 在MyEclipse中使用javadoc导出API文档详解

    本篇文档介绍如何在MyEclipse中导出javadoc(API)帮助文档,并且使用htmlhelp.exe和jd2chm.exe生成chm文档. 具体步骤如下: 打开MyEclipse,选中想要制作 ...

  10. TensorFlow入门:安装常用的依赖模块

    TensorFlow运行中常用到一些Python第三方模块: numpy 存储和处理大型矩阵的科学计算包 maplotlib 最著名的绘图库 jupyter scikit-image 图像预处理 li ...