建立普通的ApiControler

右击项目中的controller文件夹·添加·控制器·包含操作的webapi2控制器(使用entity framework),写个名字,如果:Test。然后选择类,就是我们刚刚从数据库映射过来的类,然后选择我们之前设置的连接字符串名称(我前面提到最好以Db开头,Con结尾的那个东西),点确定,然后会发现controller文件夹中多出了一个类TestContoller。

打开TestController.cs,看见里面帮助我们生成了GET,PUT,POST等方法。运行项目,发现已经可以请求到这个项目的GET方法了(我们可以在数据库里面手动加几条数据,我们就会看见返回数据了,正常 情况下,返回的是200我就认为是正确的请求)。

使用Area

前面我们是在默认的Controller中建立的ApiController,但是,我们的项目一般是复杂类型的,不可将所有的东西放在一个文件夹中,所以,我们要使用Area(区域)。右击项目中的Area文件夹,添加·区域,起个名字,然后确定。就会发现,在Area目录中多了那个我们的文件夹(假如名字叫TArea)。目录结构如图:

其实相当于我们又建立了一个子项目。但是有地方需要我们进行修改,就是路由,原因有如下几点:

  1. 路由可能会请求不到我们自定义的区域。
  2. 我区域中的控制器的命名空间和类名可能会和外部的控制器重复,导致路由找到两个。

那么我们就要做如下几点:

  1. 修改WEBAPI主路由设置类,将WebApiConfig.cs中的路由加上Area这个项。
  2. 修改Area下我们的区域内的AdminAreaRegistration.cs这个文件的内容。

个性WEBAPI主路由设置

代码如下:

public static void Register(HttpConfiguration config)
{
// Web API 配置和服务
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/plain"));
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json"));
// Web API 路由
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultAreaApi",
routeTemplate: "Api/{area}/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Filters.Add(new WebApi.Filters.ExceptionHandlingAttribute());
}

config.Formatters的三条语句,其实就是在这一步顺便加上的,因为文章没必须再开一个区域写这段代码。config.Formatters是用来设置转换器的,一旦加上了text/plain和application/json等(默认xml已经有了),就可以根据用户请求时的content-type来返回与其一样的格式的内容。如,用户请求时content-type写的是application/json,数据也是application/json格式的,那么得到的返回的值也会是application/json格式。xml和text/html相同的原理。当然,如果用户在Accept头中强写了application/json等指定类型,那么不管用户请求的数据是什么格式以及content-type是如何设置的,asp.net都会根据Accept中的格式进行序列化返回结果给用户。我们加上上面那三句,纯是为了增加对json以及纯文件的支持。

routeTemplate是路由模板的设置,其中Api这个单词可以由我们自己定义,那么在以后,我们请求api的时候,就需要在域名后加上这个自定义的字符,来告诉ASP.NET我们要请求的是API,而不是正常的页面 或者 mvc的普通controller。我们会发现,这里和模板和mvc的模板不一样,因为这里少了{Action}。mvc一般会在{controller}后面跟{action},而这里没有,原因是我们的Action是Get、Post、Put、Delete等Http的Method方法,ASP.NET是直接根据HTTP请求的METHOD内容进行判断是要调用哪个Action的,因此这里根本没有{action}(也不能有啊,大哥)。{id}就不会说了,因为我们使用了EF,所以Id就代码我们的主键,在Put(修改)和Get(根据ID)取数据时是有用的。Defaults中的设置意思是id是可选的,也就是说,可以不填写,即Url中可以不存在这个id。

修改Area下我们的区域内的AdminAreaRegistration.cs

现在,我们需要让我们的Area向主模块中注册,其它这个注册操作是通过AdminAreaRegistration.cs来进行的,而vs本身也为我们自动生成了,但是,还是有地方是需要修改的,不然,会出现一些问题。修改后的代码如下:

public class AdminAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "Admin";
}
} public override void RegisterArea(AreaRegistrationContext context)
{
string[] str = new string[]
{
"WebApi.Areas.Admin.Controllers"
};
context.MapRoute(
"Admin_default",
"Api/Admin/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional },
str
);
}
}

我们继承了AreaRegistration这个父类,然后重写了AreaName这个方法 ,这个方法是主路由用来取我们这个区域的{Area}的(不知道{Area}干什么的请看上一小节的路由部分)。一旦总路由找到了对应的Area是我们的这个,就会把请求转到我们这个Area里面,由我们的Area路由进行处理。如果匹配到了对应的Controller和Action,那么就会调用这个Controller和Action进行处理。但是,需要注意的是,虽然我们区域中的ApiController在我们的区域文件夹中,但是,一旦编译成功,在DLL才不会分文件夹呢,所以,在其它的地方也有可能存在被找到的ApiController,这个会导致异常(如果找到两个的话)以及危险(没找到自己的反而找到别的地方的了)。这时,我们需要用命名空间来限定,这就是那个str数组变量的作用,它的内容是几个(一般是一个)命名空间,然后放到context.MapRoute中去。下次,这个区域的路由就到只在这几个命名空间内寻找。其实还有一个作用,就是你的ApiController在另一外项目或者DLL中,使用这个方法,完全可以将那些在外部的ApiController引用到这里被你的区域调用,是不是很爽?

调试一下,看一下能否请求到这个Area中的Controller吧,祝你成功。

转载请注明作者与出处:张峻崎 博客园

基于Oracle的EntityFramework的WEBAPI2的实现(三)—— 建立APIController及设置返回类型JSON、XML等的更多相关文章

  1. [转]基于Oracle的EntityFramework的WEBAPI2的实现(一)——准备工作

    基于Oracle的EntityFramework的WEBAPI2的实现(一)——准备工作  转载请注明作者及来源:张峻崎,博客园 目前在.net的范围内,好的而且方便的ORM的真的不是很多,与VS集成 ...

  2. 基于Oracle的EntityFramework的WEBAPI2的实现(一)——准备工作

    目前在.net的范围内,好的而且方便的ORM的真的不是很多,与VS集成方便的也就当属EntityFramework(以下简称EF,不知道为什么,总EF这个缩写好不专业).但是,好多公司使用的又是ORA ...

  3. 基于Oracle的EntityFramework的WEBAPI2的实现(二)——使用DbFirst

    之所以使用DbFirst而没有使用CodeFirst是因为考虑到现实的情况中,我们之所以会选择oracle而不是SQL SERVER,一方面是因为之前公司已经在使用Oracle,而且有好多我们需要用到 ...

  4. 基于Oracle的EntityFramework的WEBAPI2的实现(四)——自动生成在线帮助文档

    打开我们项目中的Area文件夹,正常情况下,我们会发现已经有了一个名字叫做[HelpPage]的区域(Area),这个区域是vs帮助我们自动建立的,它是一个mvc(不是webapi),它有普通的Con ...

  5. 基于Oracle的SQL优化(社区万众期待 数据库优化扛鼎巨著)

    基于Oracle的SQL优化(社区万众期待数据库优化扛鼎巨著) 崔华 编   ISBN 978-7-121-21758-6 2014年1月出版 定价:128.00元 856页 16开 编辑推荐 本土O ...

  6. 基于Oracle OCI的数据访问C语言接口ORADBI .

    基于Oracle OCI的数据访问C语言接口ORADBI cheungmine@gmail.com Mar. 22, 2008   ORADBI是我在Oracle OCI(Oracle 调用接口)基础 ...

  7. 基于ORACLE建表和循环回路来创建数据库存储过程SQL语句来实现

    一个.概要 在实际的软件开发项目.我们经常会遇到需要创造更多的相同类型的数据库表或存储过程时,.例如.假设按照尾号点表的ID号,然后,你需要创建10用户信息表,的用户信息放在同一个表中. 对于类型同样 ...

  8. 基于oracle的sql优化

    [基于oracle的sql优化] 基于oracle的sql优化 [博主]高瑞林 [博客地址]http://www.cnblogs.com/grl214 一.编写初衷描述 在应有系统开发初期,由于数据库 ...

  9. 转://从一条巨慢SQL看基于Oracle的SQL优化

    http://mp.weixin.qq.com/s/DkIPwbDKIjH2FMN13GkT4w 本次分享的内容是基于Oracle的SQL优化,以一条巨慢的SQL为例,从快速解读SQL执行计划.如何从 ...

随机推荐

  1. CGLIB介绍与原理

    转载: http://blog.csdn.net/zghwaicsdn/article/details/50957474 CGLIB介绍与原理(部分节选自网络) 一.什么是CGLIB? CGLIB是一 ...

  2. 常见浏览器bug(针对IE6及更低版本)及其修复方法

    常见bug及其修复方法有以下几种 1.双外边距浮动bug 双外边距浮动bug在IE6及更低版本中常见.所谓双外边距浮动bug是指使任何浮动元素上的外边距加倍.(见下图) 只要将元素的display属性 ...

  3. textbox和input限制文字长度

    textbox 看下面 要求(限制140,并且显示还剩余多少个文字) <asp:textbox id="txt_xm" runat="server" on ...

  4. js上传图片&预览(filereader)

    fileReader HTML5定义了FileReader作为文件API的重要成员用于读取文件,根据W3C的定义,FileReader接口提供了读取文件的方法和包含读取结果的事件模型. FileRea ...

  5. linux系统参数统计脚本

    #!/bin/sh clear if [[ $# -eq 0 ]] then #Define Variable Reset_terminal Reset_terminal=$(tput sgr0) # ...

  6. 【LeetCode 111_二叉树_遍历】Minimum Depth of Binary Tree

    解法一:递归 int minDepth(TreeNode* root) { if (root == NULL) ; if (root->left == NULL) { ; } else if ( ...

  7. Linux:Aircrack-ng

    Aircrack-ng 工具主要有 airmon-ng 处理网卡工作模式 airodump-ng 抓包 aircrack-ng 破解 aireplay-ng 发包,干扰 另外还要用到以下 linux ...

  8. Getting command line access to PHP and MySQL running MAMP on OSX

    建立自己profile路径应该在/Users/yourname/,最后要运行. ./.profile使文件生效,和windows中给添加环境变量是一个道理,还可以看出linux和UNIX默认运行路径为 ...

  9. 【SQL查询】分区查询Over

    1. Over介绍 Over为开窗函数.就是把满足条件的数据分成几个区域,每个区域可以通过像现实中的“窗口”来观察统计这些数据. over不能单独使用,要和分析函数:rank(), dense_ran ...

  10. Spring AOP的使用报错!

    用构造方法注入的时候 需要把无参构造方法手动加上 AOP底层会调用无参构造方法. 不加则报错:Superclass has no null constructors but no arguments ...