建立普通的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. hdu3718

    题解: 见图 按照每一个位置上有相同加一 然后km 代码: #include<cstdio> #include<cmath> #include<cstring> # ...

  2. 在关于原生js获取getAttribute如果是src的一点注意事项

    最近抽空把seajs看完了 他们在fix代码的时候,写明在某浏览器下的情况和官方文档出处,这样有据可查.太赞了 顺便把我想要这段摘出来 可以直接dom.src,但是在ie6-7中是不支持的,并且在ge ...

  3. 安装mysql 5.7版本遇到问题及解决办法

    遇见问题:1.执行MySql启动命令:net start mysql 报错:Mysql 服务正在启动Mysql 服务无法启动 服务没有报告任何错误. 解决办法:在mysql的安装目录下在my-defa ...

  4. mssqlserver SQL注释快捷键

    注释快捷键 选中语句(快捷键:光标定位到需要注释块的最顶行,按住shift+home选中行,放开再按下shift+向下键,选中块) 按住Ctrl然后依次按K,C取消注释快捷键 选中语句 按住Ctrl然 ...

  5. word中怎么快速选中光标之前或之后的全部内容?

    在Word中,快速选中=光标之后=的全部内容的快捷键:Ctrl + Shift + End:在Word中,快速选中=光标之前=的全部内容的快捷键:Ctrl + Shift + Home.在Word中, ...

  6. Java基础拾遗(一)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76358391冷血之心的博客) 马上就要秋招了,新的一轮笔试面试马上 ...

  7. 使用ElasticSearch完成百万级数据查询附近的人功能

    上一篇文章介绍了ElasticSearch使用Repository和ElasticSearchTemplate完成构建复杂查询条件,简单介绍了ElasticSearch使用地理位置的功能. 这一篇我们 ...

  8. BDD测试框架Spock概要

    前言 为了找到一个适合自己的.更具操作性的.以DDD为核心的开发方法,我最近一直在摸索如何揉合BDD与DDD.围绕这个目标,我找到了Impact Mapping → Cucumber → Spock ...

  9. grunt使用

    grunt例子:https://github.com/Aquarius1993/gruntDemo 1.前提是已经有npm(可以通过安装nodejs实现) 2. npm update -g npm 更 ...

  10. MFMailComposeViewController发送邮件

    1.iPhone API已经提供了系统写邮件界面的接口,使用MFMailComposeViewController,用来显示界面. 2.项目中需要添加MessageUi.framework.头文件加入 ...