一、如何新建一个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. Python_多线程threading模块

    python 在执行的时候会淡定的在CPU上只允许一个线程运行,故Python在多核CPU的情况下也只能发挥出单核的功能,其中的原因:gil锁 gil 锁 (全局解释器锁):每个线程在执行时都需要先获 ...

  2. HBase总结 LSM理解

    转载的文章,觉得写的比较好 讲LSM树之前,需要提下三种基本的存储引擎,这样才能清楚LSM树的由来: 哈希存储引擎  是哈希表的持久化实现,支持增.删.改以及随机读取操作,但不支持顺序扫描,对应的存储 ...

  3. docker-- 卷

    进入容器centos终端中 #docker   attach   c1 在 容器中安装nginx #yum   install  epel-relesae #yum  install  nginx # ...

  4. 批量导出hive表的建表语句

    转的这里的 首先先导出所有的table表 hive -e "use xxxdb;show tables;" > tables.txt 然后再使用hive内置语法导出hive表 ...

  5. skywalking6.0.0安装配置(windows),以mysql作为储存。

    下载skywalking6.0.0http://skywalking.apache.org/downloads/ 下载jdk8https://www.oracle.com/technetwork/ja ...

  6. eclipse 下载安装单元测试log4j的配置与搭建

    搭建log4j的具体步骤 1.下载jar包放在lib 拓展库中 百度云下载 地址 链接:https://pan.baidu.com/s/1Cvb22kCJcymORehwhKnCrQ 提取码:b55m ...

  7. Problem B. Beer Refrigerator

    http://codeforces.com/gym/241680/problem/B比赛的时候考虑的是,它们3个尽可能接近,然后好麻烦,不如暴力枚举,这里不需要质因数分解,而是两重循环枚举所有因数,第 ...

  8. ORA-12541:tns:no listener

    打开任务管理器,查看服务,看箭头所指的三个服务是否开启即可

  9. js为什么是单线程的?10分钟了解js引擎的执行机制

    深入理解JS引擎的执行机制 1.JS为什么是单线程的? 为什么需要异步? 单线程又是如何实现异步的呢? 2.JS中的event loop(1) 3.JS中的event loop(2) 4.说说setT ...

  10. spring-boot-maven-plugin 安装本地jar 包

    本地使用nexus 进行maven仓库管理.项目deploy 引入之后,总是找不到jar中定义的class或者配置文件等. 从截图上可以看到虽然class文件是有的,但是引用的时候却是找不到的. Sp ...