一、如何新建一个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开发遇到的坑的更多相关文章

  1. 【WebApi系列】浅谈HTTP在WebApi开发中的运用

    WebApi系列文章 [01]浅谈HTTP在WebApi开发中的运用 [02]聊聊WebApi体系结构 [03]详解WebApi参数的传递 [04]详解WebApi测试和PostMan [05]浅谈W ...

  2. 简述移动端IM开发的那些坑:架构设计、通信协议和客户端

    1.前言 有过移动端开发经历的开发者都深有体会:移动端IM的开发,与传统PC端IM有很大的不同,尤其无线网络的不可靠性.移动端硬件设备资源的有限性等问题,导致一个完整的移动端IM架构设计和实现都充满着 ...

  3. Restful WebApi开发实践

    随笔分类 - Restful WebApi开发实践   C#对WebApi数据操作 摘要: ## 目标简化并统一程序获取WebApi对应实体数据的过程,方便对实体进行扩充.原理就是数据服务使用反射发现 ...

  4. 基于flask的轻量级webapi开发入门-从搭建到部署

    基于flask的轻量级webapi开发入门-从搭建到部署 注:本文的代码开发工作均是在python3.7环境下完成的. 关键词:python flask tornado webapi 在python虚 ...

  5. iOS开发遇到的坑之五--解决工程已存在plist表,数据却不能存入的问题

    想写这篇博客其实在一两个月前开发遇见的时候就想把这个问题写成博客的,奈何自己一直懒外加一直没有时间,就把这个事情给耽搁了,好在当时知道下自己一定要把这个问题给描述出来,免得以后其他人遇到这个问题会纠结 ...

  6. Android使用WebView开发常见的坑

    原文链接:http://mp.weixin.qq.com/s?__biz=MzAwODE1NTI2MQ==&tempkey=uP3a%2BOgIN7vPbLfJp3BTCl2KabYi1%2F ...

  7. flutter入门开发的一些坑

    flutter入门开发的一些坑 很久没写博客了,最近在准备物联网比赛,顺便抽出时间学习了一下flutter,花了近2周完成了一个查看博客博文的一个小的APPdemo,随便截了两张图,如下: 首页 博客 ...

  8. Eclipse中Python开发环境搭建

    Eclipse中Python开发环境搭建  目 录  1.背景介绍 2.Python安装 3.插件PyDev安装 4.测试Demo演示 一.背景介绍 Eclipse是一款基于Java的可扩展开发平台. ...

  9. 【Fine原创】JMeter分布式测试中踩过的那些坑

    最近因为项目需要,研究了性能测试的相关内容,并且最终选用了jmeter这一轻量级开源工具.因为一直使用jmeter的GUI模式进行脚本设计,到测试执行阶段工具本身对资源的过量消耗给性能测试带来了瓶颈, ...

随机推荐

  1. 一起学Hive——总结常用的Hive优化技巧

    今天总结本人在使用Hive过程中的一些优化技巧,希望给大家带来帮助.Hive优化最体现程序员的技术能力,面试官在面试时最喜欢问的就是Hive的优化技巧. 技巧1.控制reducer数量 下面的内容是我 ...

  2. net core 获取配置文件

    IConfiguration服务是net core 默认依懒注入的一个对象 直接注入(推荐使用) 新建控制器 然后构造函数直接注入 [Route("api/[controller]" ...

  3. 前后台得到WEB应用的名称

    前台得到当前应用的名称: ${ pageContext.request.contextPath } 后台得到当前应用的名称: request.getServletContext().getContex ...

  4. Unix历史及相关概念回顾

    欢迎来到Unix的世界 很多人都用了很多年的Unix(其实更熟悉的是叫Linux),也接触到Unix世界中的各种概念,比如GCC.GNU.BSD.POSIX.GPL等等,也大都知道一些传奇的如雷贯耳的 ...

  5. js 把 json 转为以 ‘&’ 连接的字符串

    /** * URL编码; * @param {参数} param */ export function toParams(param) { var result = "" for ...

  6. linux 文件属性(转)

    1.  文件类型 - 普通文件 d 目录文件 l 链接文件 b 块设备文件 c 字符型设备文件 s socket文件 p 管道类型文件 块设备文件主要是指慢速设备,比如hd硬盘,数据主要是分块存储,所 ...

  7. Selenium 3----设置元素等待

    在做Web应用的自动化测试时,定位元素必不可少,这个过程经常出现定位不到元素的情况,常见原因有哪些呢? 1.描述错误 提高编写水平.细心 2.Frame/Iframe框架原因 在元素所在框架里定位该元 ...

  8. 使用Xilinx UART-LITE IP实现串口--逻辑代码实现

    `timescale 1ns / 1ps /////////////////////////////////////////////////////////////////////////////// ...

  9. 如何组织AxTOCControl里面的数据

    如何组织AxTOCControl里面的数据,实际上是组织AXMapControl的数据,将添加的数据进行整理.代码在最后面. 思路参考自: https://blog.csdn.net/u0124887 ...

  10. Spring cloud 之Ribbon(二)负载均衡原理

    ribbon实现负载均衡的原理 我们从Ribbon实现负载均衡的代码可以看到,Ribbon是通过RestTemPlate实现客户端负载均衡的,准确的说是RestTemPlate上的@LoadBalan ...