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模式进行脚本设计,到测试执行阶段工具本身对资源的过量消耗给性能测试带来了瓶颈, ...
随机推荐
- 一起学爬虫——通过爬取豆瓣电影top250学习requests库的使用
学习一门技术最快的方式是做项目,在做项目的过程中对相关的技术查漏补缺. 本文通过爬取豆瓣top250电影学习python requests的使用. 1.准备工作 在pycharm中安装request库 ...
- hdu5707-Combine String(DP)
Problem Description Given three strings a, b and c , your mission is to check whether c is the combi ...
- 【CF765F】Souvenirs 主席树
[CF765F]Souvenirs 题意:给你一个长度为n的序列{ai},有m个询问,每次询问给出l,r,问在所有$l\le x < y\le r$中,$|a_x-a_y|$的最小值是多少. $ ...
- 一文搞定scrapy爬取众多知名技术博客文章保存到本地数据库,包含:cnblog、csdn、51cto、itpub、jobbole、oschina等
本文旨在通过爬取一系列博客网站技术文章的实践,介绍一下scrapy这个python语言中强大的整站爬虫框架的使用.各位童鞋可不要用来干坏事哦,这些技术博客平台也是为了让我们大家更方便的交流.学习.提高 ...
- js中return false; jquery中需要这样写:return false(); Jquery 中循环 each的用法 for循环
js中return false; jquery中需要这样写:return false(); Jquery 中循环 each的用法 $(".progressName").each(f ...
- ECMA Script 6_唯一容器 Set_映射容器 Map
唯一容器 Set ES6 提供了新的数据结构 Set Set 结构没有键名,只有键值(或者说 键名 和 键值 是同一个值) 它类似于数组,但是成员的值都是唯一的,没有重复的值 Set 内部判断两个值是 ...
- [LeetCode] Quad Tree Intersection 四叉树相交
A quadtree is a tree data in which each internal node has exactly four children: topLeft, topRight, ...
- 熟悉Linux常用命令
cd命令:切换目录 (1)切换到目录 /usr/localcd / usrcd / local (2)去到目前的上层目录cd .. (3)回到自己的主文件夹cd ls命令:查看文件与目录 (4)查看目 ...
- checkPathValidity 检查所有agent的corridor的m_path是否有效
在checkPathValidity(检查所有agent的corridor的m_path是否有效) 如果是无效的要进行重新设置并且设置replan 首先获得第一个polygon,m_path[0] 这 ...
- ad 线束和网络
ad 线束和通道复用会遇到网络无法更新的pcb的异常, 就算,我们把网络作用范围调整到页,电源全局仍然会失败,通过查找原因 尽量网络标签不同.稍微更改就可以 比如 sda1,sda1s不要一样