ASP.NET MVC4 ASP.NET Web API路由规则
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Web.Http;
namespace iAttendance.Controllers
{
    public class UsersController : ApiController
    {
        // GET api/users
        public IEnumerable<Users> GetUserList()
        {
            using (iAttendanceDataContext db = new iAttendanceDataContext())
            {
                return db.Users.AsQueryable();
            }
        }
// GET api/users/5
        public Users GetUser(int id)
        {
            using (iAttendanceDataContext db = new iAttendanceDataContext())
            {
                return db.Users.FirstOrDefault(u=>u.UserID==id);
            }
        }
// POST api/users
        public void PostUser(Users user)
        {
            using (iAttendanceDataContext db = new iAttendanceDataContext())
            {
                db.Users.InsertOnSubmit(user);
                db.SubmitChanges();
            }
        }
// PUT api/users/5
        public void PutUser(int id, Users user)
        {
            using (iAttendanceDataContext db = new iAttendanceDataContext())
            {
                var use = db.Users.SingleOrDefault(u => u.UserID == id);
                if (use != null)
                {
                    use.Role = user.Role;
                    use.Password = user.Password;
                    use.Email = user.Email;
db.SubmitChanges();
                }
            }
        }
// PUT api/users/5
        public void put_nomorl_user(int id, Users user)
        {
            using (iAttendanceDataContext db = new iAttendanceDataContext())
            {
                var use = db.Users.SingleOrDefault(u => u.UserID == id);
                if (use != null)
                {
                    use.Role = user.Role;
                    use.Password = user.Password;
                    use.Email = user.Email;
db.SubmitChanges();
                }
            }
        }
// DELETE api/users/5
        public void DeleteUset(int id)
        {
            using (iAttendanceDataContext db = new iAttendanceDataContext())
            {
                var user = db.Users.SingleOrDefault(u => u.UserID == id);
                if (user != null)
                {
                    db.Users.DeleteOnSubmit(user);
                    db.SubmitChanges();
                }
            }
        }
// [HttpGet]
       // public IEnumerable<Customer> SelectAllCustomers()
       // {
       //...
       // }
// [HttpGet]
       // public Customer SelectCustomerByID(string id)
       // {
       //...
       // }
// [HttpPost]
       // public string AddCustomer(Customer obj)
       // {
       //...
       // }
// [HttpPut]
       // public string ModifyCustomer(string id, Customer obj)
       // {
       //...
       // }
// [HttpDelete]
       // public string RemoveCustomer(string id)
       // {
       //...
       // }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;
using System.Web.Routing;
using System.Web.Http;
using System.Web.Mvc;
namespace iAttendance
{
    public class Global : System.Web.HttpApplication
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
        }
public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
public static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
               name: "VersionActionApi",
               routeTemplate: "api/1/{controller}/{action}/{id}",//api/version/controller/action/id
               defaults: new { id = RouteParameter.Optional }
           );
config.Routes.MapHttpRoute(
                name: "ActionApi",
                routeTemplate: "api/{controller}/{action}/{id}",//api/version/type/controller/action/id
                defaults: new { id = RouteParameter.Optional }
            );
config.Routes.MapHttpRoute(
                name: "VersionApi",
                routeTemplate: "api/1/{controller}/{id}",//api/version/controller/id
                defaults: new { id = RouteParameter.Optional }
            );
config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
void Application_Start(object sender, EventArgs e)
        {
            // 在应用程序启动时运行的代码
            Register(GlobalConfiguration.Configuration);
            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);
        }
void Application_End(object sender, EventArgs e)
        {
            //  在应用程序关闭时运行的代码
}
void Application_Error(object sender, EventArgs e)
        {
            // 在出现未处理的错误时运行的代码
}
void Session_Start(object sender, EventArgs e)
        {
            // 在新会话启动时运行的代码
}
void Session_End(object sender, EventArgs e)
        {
            // 在会话结束时运行的代码。
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using RestSharp;
using RestSharp.Serializers;
namespace iAttendWinFrm
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void ThreadSafe(Control control, MethodInvoker function)
        {
            if ((function != null) && (control != null))
            {
                if (control.InvokeRequired)
                {
                    control.Invoke(function);
                }
                else
                {
                    function();
                }
            }
        }
private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                var client = new RestClient("http://localhost");
                var request = new RestRequest("api/users", Method.GET);
                var response = client.Execute(request);
                this.textBox1.Text = response.Content;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                var client = new RestClient("http://localhost");
                var request = new RestRequest() { Resource = "api/users", Method = Method.GET, RequestFormat = DataFormat.Json};
                client.ExecuteAsync(request, response =>
                {
                    this.ThreadSafe(this, () =>
                    {
                        this.textBox1.Text = response.Content;
                    });
                });
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
private void button3_Click(object sender, EventArgs e)
        {
            try
            {
                var client = new RestClient("http://localhost");
                var request = new RestRequest("api/users/{id}", Method.GET);
                request.AddParameter("id", "1");
                var response = client.Execute(request);
                this.textBox1.Text = response.Content;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
private void button4_Click(object sender, EventArgs e)
        {
            try
            {
                var client = new RestClient("http://localhost");
                var request = new RestRequest() 
                { 
                    Resource = "api/users/{id}",
                    Method = Method.GET,
                    RequestFormat = DataFormat.Json 
                };
                request.AddParameter("id", "1");
                client.ExecuteAsync(request, response =>
                {
                    this.ThreadSafe(this, () =>
                    {
                        this.textBox1.Text = response.Content;
                    });
                });
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
private void button5_Click(object sender, EventArgs e)
        {
            try
            {
                var client = new RestClient("http://localhost");
                //var request = new RestRequest() { Resource = "api/1/user/users", Method = Method.POST, RequestFormat = DataFormat.Json };
                var request = new RestRequest() { Resource = "api/1/users", Method = Method.POST, RequestFormat = DataFormat.Json };
                request.AddBody(new { Email = "fx@163.com", Password = "111111", Role = 0, UserID=string.Empty,UserName = "5555555555" });
var response = client.Execute(request);
                this.textBox1.Text = response.Content;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
private void button8_Click(object sender, EventArgs e)
        {
            try
            {
                var client = new RestClient("http://localhost");
                var request = new RestRequest() 
                { 
                    Resource = "api/users",
                    Method = Method.POST,
                    RequestFormat = DataFormat.Json 
                };
                request.AddBody(new { Email = "fx@163.com", Password = "2235425325", Role = 0, UserID = string.Empty, UserName = "77777777" });
                client.ExecuteAsync(request, response =>
                {
                    this.ThreadSafe(this, () =>
                    {
                        this.textBox1.Text = response.Content;
                    });
                });
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
private void button6_Click(object sender, EventArgs e)
        {
            try
            {
                var client = new RestClient("http://localhost");
                //var request = new RestRequest() { Resource = "api/users/PutUser/{id}", Method = Method.PUT, RequestFormat = DataFormat.Json };
                //var request = new RestRequest() { Resource = "api/1/users/PutUser/{id}", Method = Method.PUT, RequestFormat = DataFormat.Json };
                var request = new RestRequest() { Resource = "api/1/users/put_nomorl_user/{id}", Method = Method.PUT, RequestFormat = DataFormat.Json };
                request.AddUrlSegment("id", "11");
                request.AddParameter("Email", "6666666@163.com");
                request.AddParameter("Password", "666666666");
                request.AddParameter("Role", 1);
                var response = client.Execute(request);
                this.textBox1.Text = response.Content;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
private void button7_Click(object sender, EventArgs e)
        {
            try
            {
                var client = new RestClient("http://localhost");
                var request = new RestRequest() { Resource = "api/users/{id}", Method = Method.PUT, RequestFormat = DataFormat.Json };
                request.AddUrlSegment("id", "14");
                request.AddParameter("Email", "fxxx@163.com");
                request.AddParameter("Password", "1324324234");
                request.AddParameter("Role", 1);
                client.ExecuteAsync(request, response =>
                {
                    this.ThreadSafe(this, () =>
                    {
                        this.textBox1.Text = response.Content;
                    });
                });
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
private void button9_Click(object sender, EventArgs e)
        {
            try
            {
                var client = new RestClient("http://localhost");
                var request = new RestRequest() { Resource = "api/users/{id}", Method = Method.DELETE, RequestFormat = DataFormat.Json };
                request.AddUrlSegment("id", "15");
                var response = client.Execute(request);
                this.textBox1.Text = response.Content;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
private void button10_Click(object sender, EventArgs e)
        {
            try
            {
                var client = new RestClient("http://localhost");
                var request = new RestRequest() { Resource = "api/users/{id}", Method = Method.DELETE, RequestFormat = DataFormat.Json };
                request.AddUrlSegment("id", "15");
                client.ExecuteAsync(request, response =>
                {
                    this.ThreadSafe(this, () =>
                    {
                        this.textBox1.Text = response.Content;
                    });
                });
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
}
}
//-------------------------------------------------------------------
默认的规则
在ASP.NET MVC4中
global.asax.cs代码中并无注册默认路由规则的代码
代码如下:
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
那么默认的路由规则是在哪里注册的呢?
我们发现
在项目中多了一个App_Start文件夹

其中RoteConfig.cs文件就是注册默认路由规则的程序所在了
代码如下:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
); routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
这里有两个路由规则
一个是针对API请求的路由规则
另一个是针对普通MVC页面请求的路由规则
请求路径以字符串”api”开头的时候将访问webAPI的函数
(注:至于为什么用MapHttpRoute而不是MapRoute;为什么用routeTemplate而不是用url我们再以后的章节介绍)
因为routeTemplate中有了{controller}
所以针对api的请求可以自动映射到指定的controller类
那么是怎么找到合适的Action的呢?
系统根据请求的方式来判断
如果是以GET的方式请求的
那么将匹配controller中以“Get”开头的Action
如果是以POST的方式请求的
那么将匹配controller中以“Post”开头的Action
如果是以PUT的方式请求的
那么将匹配controller中以“Put”开头的Action
如果是以DELETE的方式请求的
那么将匹配controller中以“Delete”开头的Action
除了这几个默认的请求方式
你还可以在客户端定义你自己的请求方式!
routeTemplate最后面的id匹配Action中的参数,
这与ASP.NET MVC一致
初步的自定义
那么是不是所有的匹配GET请求的Action都必须以“Get”开头呢
不是的
我们可以用方法特性来标记一个方法属于什么什么请求
如下:
[HttpGet]
public IEnumerable<Product> AllProducts()
{
return products;
}
对应的方法特性还有
[HttpPost]
[HttpDelete]
[HttpPut]
亦可以使用如下这样的方法特性来区分
[AcceptVerbs("GET")]
[AcceptVerbs("GET", "HEAD")]
另外如果你在Controller中写了一个函数
必须是public的,必须以Get开头
而又不想让客户端以请求到此Action
那么可以使用方法特性
[NonAction]
来标记此方法
进一步自定义
我们仍然可以把action的名字放到默认的请求规则中
只要把routeTemplate改为如下即可:
routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
ASP.NET MVC4 ASP.NET Web API路由规则的更多相关文章
- ASP.NET Web API路由规则(二)
		
默认的规则 在ASP.NET MVC4中 global.asax.cs代码中并无注册默认路由规则的代码 代码如下: public class WebApiApplication : System.We ...
 - ASP.NET MVC4中调用WEB API的四个方法
		
http://tech.it168.com/a2012/0606/1357/000001357231_all.shtml [IT168技术]当今的软件开发中,设计软件的服务并将其通过网络对外发布,让各 ...
 - ASP.NET Web API路由规则(二) 【转】
		
http://www.cnblogs.com/liulun/archive/2012/06/20/2556556.html 默认的规则 在ASP.NET MVC4中 global.asax.cs代码中 ...
 - web api 路由规则和接收数据
		
1:默认是不带action的 所以再访问的时候 只需要 api/控制 2:加了action 就要 api/控制器/方法名字 接收方法 传参 json 序列化传参
 - ASP.NET Web API 路由对象介绍
		
ASP.NET Web API 路由对象介绍 前言 在ASP.NET.ASP.NET MVC和ASP.NET Web API这些框架中都会发现有路由的身影,它们的原理都差不多,只不过在不同的环境下作了 ...
 - ASP.NET Web API路由系统:路由系统的几个核心类型
		
虽然ASP.NET Web API框架采用与ASP.NET MVC框架类似的管道式设计,但是ASP.NET Web API管道的核心部分(定义在程序集System.Web.Http.dll中)已经移除 ...
 - ASP.NET Web API路由系统:Web Host下的URL路由
		
ASP.NET Web API提供了一个独立于执行环境的抽象化的HTTP请求处理管道,而ASP.NET Web API自身的路由系统也不依赖于ASP.NET路由系统,所以它可以采用不同的寄宿方式运行于 ...
 - Asp.Net Web API 2第六课——Web API路由和动作选择
		
Asp.Net Web API 导航 Asp.Net Web API第一课——入门http://www.cnblogs.com/aehyok/p/3432158.html Asp.Net Web AP ...
 - ASP.NET Web API 路由
		
路由系统是请求消息进入ASP.NET Web API消息处理管道的第一道屏障,其根本目的是利用注册的路由表(RouteTable)对请求的URI进行解析以确定目标HttpController和Acti ...
 
随机推荐
- LFM 隐语义模型
			
隐语义模型: 物品 表示为长度为k的向量q(每个分量都表示 物品具有某个特征的程度) 用户兴趣 表示为长度为k的向量p(每个分量都表示 用户对某个特征的喜好程度) 用户u对物品i的兴趣 ...
 - python 访问器@property的使用方法
			
@property 可以将python定义的函数"当做"属性访问,从而提供更加友好访问方式,但是有时候setter/getter也是需要的 假设定义了一个类Cls,该类必须继承自o ...
 - 学习wxpython的网站
			
http://xoomer.virgilio.it/infinity77/Phoenix/main.html https://wxpython.org/Phoenix/docs/html/main.h ...
 - PHPExcel Fatal error: ZipArchive library is not enabled
			
导致上述问题的可能性有两种: 1.没开启php_zip.dll扩展 a.在Windows下的解决办法是: (a1) 在php.ini文件中,将extension=php_zip.dll前面的分号“; ...
 - HDOJ 2689
			
Sort it Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
 - Haffman算法(C++)
			
Huffman编码,C++实现,只是为了说明大致的思路,还有很多不完美之处,比如在输入数据超出限制等条件下会出现错误. #include<iostream> #include<str ...
 - 谈谈css3的字体大小单位[rem]
			
最近接收了一份面试题,内容是移动端传播的H5(在中国通常这么叫)广告页. 秉承移动端web尽量少用px的概念,我使用rem进行了一次重构.对于rem,基本是给 html/body 元素定义一个字体大小 ...
 - [RabbitMQ]Error: unable to connect to node rabbit@compute1: nodedown(CentOS7.0)
			
今天在搭建OpenStack的时候需要安装RabbitMQ,可是使用yum install rabbitmq-server安装之后,按照OpenStack官方提供的文档修改guest用户密码的时候却出 ...
 - 一个证书多次使用-导出p12文件
			
在苹果开发者网站申请的证书,是授权mac设备的开发或者发布的证书,这意味着一个设备对应一个证书,但是99美元账号只允许生成3个发布证书,两个开发证书,这满足不了多mac设备的使用,使用p12文件可以解 ...
 - C++ Builder平台使用Indy9开发自动FTP程序01
			
Indy9与CB自带的Indy8不同处还是挺多的.首先就是图标变漂亮了,其次很多Method都重写了.它主要是依据Delph里的函数,力求与之相通.不同点在本系列的后续章节中会一一介绍. 在写ftp代 ...