c#中WebApi开发遇到的坑
一、如何新建一个webApi项目
打开VS→找到解决方案→新建项目→类库或web应用程序→选择空的WebApi项目→在Global.asax文件的Application_Start方法中注册WebApi的相关配置→完成
二、如何对外提供api接口
在webApi项目的Controllers文件夹下新增一个类继承ApiController,在该类中就可以完成对外接口(GET、POST、PUT、DELETE等),需要注意的是如果提供的方法需要参数,则参数的类型不能按它实际的类型声明和传递,如Name不能直接声明为string类型,否则调用该接口时会报404错误,找不到该访问地址。声明的方式有很多种:
(1)创建一个类,该类只包含该方法所需的参数。
(2)引用FormDataCollection类来声明和接收参数。
这是常用的声明方式,推荐方法(2)。下面用例子的形式说明错误写法和正确写法
#region 参数声明示例·错误写法
[Route("Example")]
[HttpPost]
public object Example(string name)
{
var response = new ResponseModel
{
StatusCode = ,
Message = "接收数据成功!",
Data = name
};
return Json(response);
}
#endregion
#region 参数声明示例·正确写法
[Route("Example")]
[HttpPost]
public object Example(FormDataCollection collection)
{
var name = collection.Get("name");
var response = new ResponseModel
{
StatusCode = ,
Message = "接收数据成功!",
Data = name
};
return Json(response);
}
#endregion
#region 参数声明示例·正确写法
[Route("Example")]
[HttpPost]
public object Example(DataInfo data)
{
var response = new ResponseModel
{
StatusCode = ,
Message = "接收数据成功!",
Data = data.Name
};
return Json(response);
}
#endregion public class DataInfo
{
public string Name { get; set; }
}
三、自定义票据验证筛选器
(1)创建类 AuthorFilter 继承 AuthorizeAttribute
using System;
using System.Configuration;
using System.Web;
using System.Web.Http;
using System.Web.Http.Controllers;
using System.Web.Security;
using Xryang.Core.Config; namespace Xryang.Api.Author
{
public class AuthorFilter : AuthorizeAttribute
{
public override void OnAuthorization(HttpActionContext actionContext)
{
#region 验证token → 请求数据
var content = actionContext.Request.Properties["MS_HttpContext"] as HttpContextBase;
var token = content.Request.Headers["Secret"];
if (!string.IsNullOrEmpty(token))
{
//验证token
if (ValidateTicket(token))
{
base.IsAuthorized(actionContext);
}
else
{
HandleUnauthorizedRequest(actionContext);
}
return;
}
#endregion #region 请求token
var appId = content.Request.Headers["AppId"];
if (!string.IsNullOrEmpty(appId))
{
//验证AppId
if (IsAllowAppId(appId))
{
base.IsAuthorized(actionContext);
}
else
{
HandleUnauthorizedRequest(actionContext);
}
return;
}
#endregion #region 非法请求
HandleUnauthorizedRequest(actionContext);
#endregion
} #region 验证Token
//校验票据(数据库数据匹配)
private bool ValidateTicket(string token)
{
bool flag = false;
try
{
//解密Token
var ticket = FormsAuthentication.Decrypt(token).UserData;
if (ticket.Equals("token示例"))
flag = true;
}
catch (Exception ex)
{ }
return flag;
}
#endregion #region 验证AppId
private bool IsAllowAppId(string appId)
{
var config = ConfigurationManager.GetSection("XryangConfig") as XryangConfig;
if (string.IsNullOrEmpty(appId) || string.IsNullOrEmpty(config.AppId)) return false;
if (appId.Equals(config.AppId)) return true;
return false;
}
#endregion
}
}
(2)在api控制器或方法上加上 [AuthorFilter] 即可
using System;
using System.Net.Http.Formatting;
using System.Web.Http;
using System.Web.Security;
using Xryang.Api.Author;
using Xryang.Model.Commons; namespace Xryang.Api.Controllers
{
[AuthorFilter]
[RoutePrefix("Api/App")]
public class AppController : ApiController
{ #region 获取token
[Route("Token")]
[HttpPost]
public object Token()
{
var response = new ResponseModel
{
StatusCode = ,
Message = "很抱歉,系统出错了",
};
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(, "token示例", DateTime.Now,
DateTime.Now.AddHours(), true, "token示例",
FormsAuthentication.FormsCookiePath);
if (ticket != null)
{
var token = FormsAuthentication.Encrypt(ticket);
response.StatusCode = ;
response.Message = "获取成功";
response.Data = new { Secret = token };
}
return Json(response);
}
#endregion #region 参数声明示例·正确写法
[Route("Example")]
[HttpPost]
public object Example(FormDataCollection data)
{
var response = new ResponseModel
{
StatusCode = ,
Message = "接收数据成功!",
Data = data.Get("Name")
};
return Json(response);
}
#endregion
}
}
c#中WebApi开发遇到的坑的更多相关文章
- 【WebApi系列】浅谈HTTP在WebApi开发中的运用
WebApi系列文章 [01]浅谈HTTP在WebApi开发中的运用 [02]聊聊WebApi体系结构 [03]详解WebApi参数的传递 [04]详解WebApi测试和PostMan [05]浅谈W ...
- 简述移动端IM开发的那些坑:架构设计、通信协议和客户端
1.前言 有过移动端开发经历的开发者都深有体会:移动端IM的开发,与传统PC端IM有很大的不同,尤其无线网络的不可靠性.移动端硬件设备资源的有限性等问题,导致一个完整的移动端IM架构设计和实现都充满着 ...
- Restful WebApi开发实践
随笔分类 - Restful WebApi开发实践 C#对WebApi数据操作 摘要: ## 目标简化并统一程序获取WebApi对应实体数据的过程,方便对实体进行扩充.原理就是数据服务使用反射发现 ...
- 基于flask的轻量级webapi开发入门-从搭建到部署
基于flask的轻量级webapi开发入门-从搭建到部署 注:本文的代码开发工作均是在python3.7环境下完成的. 关键词:python flask tornado webapi 在python虚 ...
- iOS开发遇到的坑之五--解决工程已存在plist表,数据却不能存入的问题
想写这篇博客其实在一两个月前开发遇见的时候就想把这个问题写成博客的,奈何自己一直懒外加一直没有时间,就把这个事情给耽搁了,好在当时知道下自己一定要把这个问题给描述出来,免得以后其他人遇到这个问题会纠结 ...
- Android使用WebView开发常见的坑
原文链接:http://mp.weixin.qq.com/s?__biz=MzAwODE1NTI2MQ==&tempkey=uP3a%2BOgIN7vPbLfJp3BTCl2KabYi1%2F ...
- flutter入门开发的一些坑
flutter入门开发的一些坑 很久没写博客了,最近在准备物联网比赛,顺便抽出时间学习了一下flutter,花了近2周完成了一个查看博客博文的一个小的APPdemo,随便截了两张图,如下: 首页 博客 ...
- Eclipse中Python开发环境搭建
Eclipse中Python开发环境搭建 目 录 1.背景介绍 2.Python安装 3.插件PyDev安装 4.测试Demo演示 一.背景介绍 Eclipse是一款基于Java的可扩展开发平台. ...
- 【Fine原创】JMeter分布式测试中踩过的那些坑
最近因为项目需要,研究了性能测试的相关内容,并且最终选用了jmeter这一轻量级开源工具.因为一直使用jmeter的GUI模式进行脚本设计,到测试执行阶段工具本身对资源的过量消耗给性能测试带来了瓶颈, ...
随机推荐
- C# 调用百度地图 Web 服务 API
最近公司项目中需要根据两个地点的交通路径和距离做一些数据推荐,为了程序的稳定和用户体验所以想从百度地图 API 采集数据保存到数据库中,经过一翻研究之后选定了百度地图 Web 服务 API 中的 Di ...
- Ubuntu+IntelliJ IDEA+Android 配置NDK环境+openCV
最近需要将Python人证对比模型移植安卓端.安卓端需要使用openCV简单的人像提取处理.在配置openCV前首先需要配置NDK环境. NDK的介绍(http://www.cnblogs.com/l ...
- Fiddler工具使用介绍
Fiddler基础知识 Fiddler是强大的抓包工具,它的原理是以web代理服务器的形式进行工作的,使用的代理地址是:127.0.0.1,端口默认为8888,我们也可以通过设置进行修改. 代理就是在 ...
- Python学习之MySQLdb模块
摘要: MySQLdb模块用于操作mysql数据库.1.安装MySQLdb模块 yum install MySQL-python -y2.操作流程①.导入模块: import MySQLdb②.连接数 ...
- git使用习惯
1.每早一更新,提交前更新 git pull -u origin master: master(master为分支名称) 2.每晚一提交: git add . (注:别忘记后面的.此操作是把文件夹下面 ...
- Android应用程序后台加载数据
从ContentProvider查询你需要显示的数据是比较耗时的.如果你在Activity中直接执行查询的操作,那么有可能导致Activity出现ANR的错误.即使没有发生ANR,用户也容易感知到一个 ...
- SQLyog 最新版本12.5-64bit 完美破解,亲测可用!
声明:本文只是提供一个网络上找到的针对12.5版本的注册码使用方式做一个说明,不建议企业用户破解,有条件的还是希望大家购买原版.当然个人学习用的但又不想购买原版的,这里只是提供个途径,请勿用做商业用途 ...
- [TopCoder]棍子
题目描述 你有一堆棍子.每个木棒的长度是一个正整数. 你想要一组棍子所有的棍子都有相同的长度.您可以通过执行零个或多个步骤来更改当前集合.每个步骤必须如下所示: 你选择一根棍子.所选棒的长度必须至少为 ...
- HBuilder 的使用
创建一个nui项目 打开index.html才能运行 查看夜神模拟器 创建App标题:mhe :在body中输入mhe让后回车,如果右侧不显示,Ctrl+s保存一下 创建标题:mhe 创建九宫格:mb ...
- BOM 浏览器对象模型_window 对象的常见 window.属性_window.方法
1. 常用属性 window.devicePixelRatio 像素比 = css / 物理像素 window.scrollX,window.scrollY 滚动条 卷曲距离 if ...