webapi研究说明
首先定义公共的返回对象
/// <summary>
/// 返回数据对象
/// </summary>
public class ResponseItem<T>
{
public Boolean success { get; set; }
public String msg { get; set; }
public T data { get; set; } public ResponseItem()
{ } public ResponseItem(Boolean success,String msg,T data)
{
this.success = success;
this.msg = msg;
this.data = data;
}
}
其次是所有的api接口都必须继承自ApiController。
文件上传的代码如下:
[HttpPost]
public String SaveFile()
{
if (Request.Content.IsMimeMultipartContent())
{
Request.Content.ReadAsMultipartAsync().ContinueWith(p =>
{
foreach (var item in p.Result.Contents)
{
if (String.IsNullOrEmpty(item.Headers.ContentDisposition.FileName))
{
continue;
} item.ReadAsStreamAsync().ContinueWith(a =>
{
Stream stream = a.Result;
String fileName = item.Headers.ContentDisposition.FileName;
fileName = fileName.Substring(, fileName.Length - );
//保存
byte[] r = new byte[stream.Length];
stream.Read(r, , r.Length); File.WriteAllBytes(Path.Combine("E:", fileName), r); });
}
});
}
return "";
}
文件下载代码如下:
[HttpGet]
public HttpResponseMessage DownLoadFile()
{
HttpResponseMessage result = null;
result = new HttpResponseMessage(HttpStatusCode.OK); String fileName = HostingEnvironment.MapPath("~/packages.config");
FileStream fs = new FileStream(fileName, FileMode.Open); result.Content = new StreamContent(fs);
result.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream");
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
result.Content.Headers.ContentDisposition.FileName = "MVC下载文件.txt"; return result;
}
在Global.asax中配置全局的JSON日期格式化格式
//注册JSON序列化方式,设置日期格式
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.
Converters.Add(new IsoDateTimeConverter
{
DateTimeFormat = "yyyy-MM-dd HH:mm:ss"
}
);
在Global.asax中配置全局的异常
//注册异常捕获类
GlobalConfiguration.Configuration.Filters.Add(
new CustomerExceptionFilterAttribute()
);
在webApiConfig中增加一个拦截器

config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
); //注册一个拦截器,所有请求都会经过这个拦截器
config.Filters.Add(new CusFilter());
拦截器代码如下:
namespace HelloWebAPI.Filter
{
public class CusFilter : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
try
{
if (actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Count > ) // 允许匿名访问
{
base.OnActionExecuting(actionContext);
return;
} var cookie = actionContext.Request.Headers.GetCookies();
if (cookie == null || cookie.Count < )
{
actionContext.Response = new HttpResponseMessage(HttpStatusCode.Forbidden);
return;
} FormsAuthenticationTicket ticket = null;
foreach (var perCookie in cookie[].Cookies)
{
if (perCookie.Name == FormsAuthentication.FormsCookieName)
{
ticket = FormsAuthentication.Decrypt(perCookie.Value);
break;
}
} if (ticket == null)
{
actionContext.Response = new HttpResponseMessage(HttpStatusCode.Forbidden);
return;
} // TODO: 添加其它验证方法 base.OnActionExecuting(actionContext);
}
catch
{
actionContext.Response = new HttpResponseMessage(HttpStatusCode.Forbidden);
}
}
}
}
关于跨域允许访问的配置,需要修改web.config文件,如下:

<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
<add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
</customHeaders>
</httpProtocol>
东西比较凌乱,主要是记录一下方便以后查看!!!
webapi研究说明的更多相关文章
- .Net Core技术研究-WebApi迁移ASP.NET Core2.0
随着ASP.NET Core 2.0发布之后,原先运行在Windows IIS中的ASP.NET WebApi站点,就可以跨平台运行在Linux中.我们有必要先说一下ASP.NET Core. ASP ...
- ASP.NET Linux部署(2) - MS Owin + WebApi + Mono + Jexus
ASP.NET Linux部署(2) - MS Owin + WebApi + Mono + Jexus 本文承接我的上一篇博文: ASP.NET 5 Linux部署,那篇文章主要是针对最新的ASP. ...
- AJAX跨域调用ASP.NET MVC或者WebAPI服务的解决方案
问题描述 当跨域(cross domain)调用ASP.NET MVC或者ASP.NET Web API编写的服务时,会发生无法访问的情况. 重现方式 使用模板创建一个最简单的ASP.NET Web ...
- C#进阶系列——WebApi 身份认证解决方案:Basic基础认证
前言:最近,讨论到数据库安全的问题,于是就引出了WebApi服务没有加任何验证的问题.也就是说,任何人只要知道了接口的url,都能够模拟http请求去访问我们的服务接口,从而去增删改查数据库,这后果想 ...
- (4)WebApi 跨域问题
在做Web开发中,常常会遇到跨域的问题,到目前为止,已经有非常多的跨域解决方案. 通过自己的研究以及在网上看了一些大神的博客,写了一个Demo 首先新建一个webapi的程序,如下图所示: 由于微软已 ...
- ASP.NET WebAPi之断点续传下载(中)
前言 前情回顾:上一篇我们遗留了两个问题,一个是未完全实现断点续传,另外则是在响应时是返回StreamContent还是PushStreamContent呢?这一节我们重点来解决这两个问题,同时就在此 ...
- WebAPI生成可导入到PostMan的数据
一.前言 现在使用WebAPI来作为实现企业服务化的需求非常常见,不可否认它也是很便于使用的,基于注释可以生成对应的帮助文档(Microsoft.AspNet.WebApi.HelpPage),但是比 ...
- WebApi Post 后台无法获取参数的解决方案
事件回放: 之前一段时间,公司里前端用的Angularjs 发送http请求也是用的ng的组件,后台是.Net的WebApi 前端 var data = { PArgs: { PageIndex: 0 ...
- WebAPI返回数据类型
最近开始使用WebAPI,上手很容易,然后有些疑惑 1.WebAPI默认返回什么数据类型,json还是xml? 2.怎么修改WebAPI的返回数据类型,我用IE浏览器请求返回的数据都是JSON格式的, ...
随机推荐
- list集合排序
https:/blog.csdn.net/veryisjava/article/details/51675036 public static void main(String[] args) { Li ...
- 树莓派3 之 USB摄像头安装和使用
需求 如果你想在树莓上拍照或者录影,你可以安装树莓派的摄像头(有点贵).如果你不想要为摄像头模块花费额外的金钱,那有另外一个方法,就是你常见的USB 摄像头.你可能已经在PC上安装过了.我买的如图的这 ...
- odoo中self的使用
一:self是什么 目前新版的Odoo中使用到的self,是对 游标cr.用户ID.模型.上下文.记录集.缓存 的封装. 我们可以通过 self.XX 获取到这些封装的东西,比如:self.cr. ...
- dbgrid 无法显示表中所有字段
有时表中字段有更新,dbgrid无法显示表中字段. 解决办法: 1.adoquery断开 2. dbgrid字段全部删除 3.adoquery打开 4.dbgrid选择全部字段
- python基础之 基本数据类型,str方法和for循环
1.概念 1.十进制转二进制,对2取余,余数倒序排列 2.字符串为空的时候,bool值为false,字符串非空就是True3.字符串转化成int时,必须是只包含数字才能转化.4.字符串转化成int时可 ...
- 图片居中table-cell
- JMeter-充值-生成随机数
1.随机数,orderId每次需要变化,需要用到随机数 验证生成的随机数:
- 利用spring实现服务启动就自动执行某些操作的2种方式
第一种方式,用bean的init-method属性 <bean class="com.emax.paycenter.log.LogBridge" init-method=&q ...
- 54.超大数据快速导入MySQL
超大数据快速导入MySQL ----千万级数据只需几十分钟本地测试方法1.首先需要修改本地mysql的编码和路径,找到my.ini.2.在里面添加或修改 character-set-server=u ...
- JS基本事件(小记)
一. 事件的概念种类及作用(一) 概念:通常鼠标或热键的动作我们称之为事件(event),热键引发的一连串程序的动作,称之为事件驱动(event Driver).而对事件进行处理的程序或函 ...