ASP.NET Web API 自定义MediaType实现jsonp跨域调用
2016-07-14 16:48
651 查看
代码来自《ASP.NET Web API 2 框架揭秘》一书。
直接上代码:
然后在Global.asax中将JsonpMediaTypeFormatter加入
Demo演示:
我在localhost:55950 用jquery 调用api(http://localhost:55599/api/search?key=%E7%83%A7%E7%81%AB&from=0&size=10)
得到结果如图:
成功调用。不过书上说,这种方法仅限于get方法。
OK,笔记完成,记录下来以防以后 用到可以参考参考。
直接上代码:
/// <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 = 1)] private struct AsyncVoid { } }
然后在Global.asax中将JsonpMediaTypeFormatter加入
protected void Application_Start() { //加入jsonpMediaTypeFormatter 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); }
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 Unix时间戳和DateTime类型转换
- 转:ASP.NET 使用Ajax
- ASP.NET MD5加密
- 收藏:ASP.NET提供文件下载函数(支持大文件、续传、速度限制、资源占用小) (转自: Arhrun)
- 各版本IIS下ASP.net请求处理过程区别
- ASP.net:截取固定长度字符串显示在页面,多余部分显示为省略号
- ASP.NET发送电子邮件
- asp.net SessionState之sqlserver模式
- asp.net 如何引用dll
- [译]初识.NET Core & ASP.NET Core
- 【Asp.Net Core】一、Visual Studio 2015 和 .NET Core 安装
- 为何没有.aspx.designer.cs文件?
- 【转】asp.net(c#)加密解密算法之sha1、md5、des、aes实现源码详解
- ASP.NET Web API系列——选择Web API还是WCF
- 在 ASP.NET MVC 项目中使用 WebForm
- asp.net webapi 自托管插件式服务
- 关于.NET、ASP.NET、C#、WinFrom、MVC以及WebForm的简单描述
- ASP.NET里面,如果设置了form的 onsubmit="return false;"之后,就不能提交按钮了?
- Asp.net mvc 自定义全局的错误事件HandleErrorAttribute无效
- ASP.NET中函数返回多个值的方法