Uxf框架引入Rest控制器特性

引入Rest风格接口的特色,主要是以适应平台化和移动化开发的用。

写于面前

移植自ThinkPHP项目的RestAction。

  以学异步,有号园友推荐了《async in
C#5.0》,没找到中文版,恰巧也想增强下英文,用本人拙劣的英文翻译一些重点的片段,纯属娱乐,简单分享,保持上,谨记谦虚。

REST(Representational State
Transfer表述性状态转移)是同样种植对网下之统筹以及开发方式,可以落开发的纷繁,提高系统的可伸缩性。REST提出了一部分统筹概念与则:

  如果你觉得这宗事情没意义翻译的以不同,尽情的踏上吧。如果您当值得鼓励,感谢留下你的称赞,愿爱技术之园友们于后诸一样次等当可以突破之早晚,不挑知难而退。在各国一样次于当单独思考的时光,不拣按波逐流,应该尽力的时,不选择尽量,不辜负每一样秒存在的意思。

  1. 网直达之持有东西都叫架空为资源(resource);
  2. 每个资源对应一个唯一的资源标识(resource identifier);
  3. 透过通用的连接器接口(generic connector interface)对资源进行操作;
  4. 针对资源的各种操作不见面转移资源标识;
  5. 具备的操作都是任状态的(stateless)。

  
转载和爬虫请注明原文链接http://www.cnblogs.com/tdws/p/5659003.html,博客园
蜗牛 2016年6月27日。

欲注意的是,REST是设计风格使休是专业。REST通常根据使用HTTP,URI,和XML以及HTML这些现有的大规模流行的合计和标准。

图片 1

习俗的恳求模式及REST模式之呼吁模式区别:

目录

作用 传统模式 REST模式
列举出所有的用户 GET /users/list GET /users
列出ID为1的用户信息 GET /users/show/id/1 GET /users/1
插入一个新的用户 POST /users/add POST /users
更新ID为1的用户信息 POST /users/mdy/id/1 PUT /users/1
删除ID为1的用户 POST /users/delete/id/1 DELETE /users/1

第01回 异步编程介绍

多了Rest模式用于支持RESTFul开发,REST模式主要提供下面的部分效能:

第02章 为什么使用异步编程

  • 路由增加请求类型和资源类型判断支持;
  • 支持资源类型自动检测;
  • 支撑请求类型自动检测;
  • RESTFul方法支持;
  • 足安装允许的求类型列表;
  • 得装允许请求与出口的资源类型;
  • 好安装默认请求类型及默认资源类型;

第03章节 手动编写异步代码

如运用REST模式,只需要控制器继承Rest_Controller类即可。

第04章 编写Async方法

配置名 说明 默认值
REST_METHOD_LIST REST允许的请求类型列表 get,post,put,delete
REST_DEFAULT_METHOD REST默认请求类型 get
REST_CONTENT_TYPE_LIST REST允许请求的资源类型列表 html,xml,json,rss
REST_DEFAULT_TYPE REST默认的资源类型 html
REST_OUTPUT_TYPE REST允许输出的资源类型列表 array(

‘xml’ => ‘application/xml’,

‘json’ => ‘application/json’,

‘html’ => ‘text/html’,

),

第05节 Await究竟做了啊

代码查看:

第06章节
以Task为底蕴之异步模式

https://gitcafe.com/web3d/uxf/blob/master/upload/source/class/rest/rest_controller.php

第07回 异步代码的一部分工具

第08节 哪个线程在运作而的代码

第09章节 异步编程中之异常

第10回 并行使用异步编程

第11章 单元测试你的异步代码

第12章 ASP.NET应用被的异步编程

第13章节 WinRT应用中之异步编程

第14回 编译器在底部为您的异步做了什么

第15段 异步代码的属性

await究竟开了哟?

  我们发出点儿栽角度来对待C#5.0之async功能特色,尤其是await关键字达闹了呀:

  ·作为一个语言的功效特色,他是一个供你念的已定义好之表现

  ·作为一个每当编译时的易,这是一个C#语法糖,为了简略之前复杂的异步代码

  这还是的确;它们就如相同枚硬币的星星点点直面。在本章,我们将会晤集中在率先点达来探索异步。在先后十四章咱俩拿会晤自其它一个角度来探索,即再复杂的,但是提供了有细节而debug和性考虑越来越分明。

休眠和提示一个方式

   当您的程序执行遇到await关键字时,我们怀念使发出两起事:

  
·为了使您的代码异步,当前实施你代码的线程应该给放飞。这象征,在一般,同步的角度来拘禁,你的道应该回到。

  
·当你await的Task完成时,你的艺术应该从之前的职连续,就如她从不当早些时候被归。

  为了完成这行为,你的法子必须以遇到await时暂停,然后在明天的某个时刻恢复执行。

  我将此历程作为一个休眠一令计算机的略微范围情况来拘禁(S4
sleep)。这个法子当前底状态会于积存起来(译者:状态存储起来,正如我们第二章厨房特别例子,厨师会把已经在烤箱中之食物的烹调状态为标签的款型贴在点),并且是方式了剥离(厨师走了,可能失掉举行另外作业了)。当一大微机休眠,计算机的动态数据和周转数据给保存到磁盘,并且变得完全关闭。下面这段话与计算机休眠大概一个道理,一个正await的不二法门除了用一些内存,不行使任何资源,那么得当做是刚刚推行之线程已经给放。

      
进一步使类似上同样段的近乎比较:一个阻塞型方法重新像你暂停一宝电脑(S3
sleep),它虽然以比较少之资源,但从根本上来讲它直接当运转在。

  以优质的动静下,我们盼望编程者察觉不顶此处的休眠。尽管实际上休眠和提示一个方式的中实施是生复杂的,C#否拿会晤保证您的代码被提示,就如什么还没产生同样。(译者:不得不称微软针对语法糖的包装和处理)。

方法的状态

  为了准确的行明白在公以await时C#究竟为我们做了不怎么事情,我怀念列有具有关于艺术状态的持有我们记住和询问的底细。

  首先,你方被本地的变量的值会被铭记,包括因下值:

  ·你道的参数

  ·在本范围外拥有你定义的变量

  ·其他变量包括循环数

  ·如果你的法非静态,那么连this变量。这样,你仿佛的分子变量在术唤醒时犹是可用的。

  他们都深受存在.NET
垃圾回收堆(GC堆)的一个目标及。因此当您利用await时,一个消耗一些资源的对象将会见于分配,但是当大多数气象下非用担心性能问题。

  C#否会铭记在艺术的哟岗位会执行到await。这可采用数字存储起来,用来表示await关键字当眼前法的职。

  以关于如何以await关键字没什么特别之界定,例如,他们得以被用当一个添加表达式上,可能包含不止一个await:

int myNum = await AlexsMethodAsync(await myTask, await StuffAsync());

  为了去记住剩余部分的表达式的状态在await某些事物常常,增加了额外的法。比如,当我们运行await
StuffAsync()时,await
myTask的结果要为铭记。.NET中间语言(IL)在栈上存储这种子类表达式,因此
,这个库房就是咱们await关键字需要仓储的。

  最要害的凡,当程序执行到第一个await关键字时,方法就是回到了(译者:关于艺术在碰到await时回来,建议读者从第一段拆分的有数单艺术来喻)。如果它们不是一个async
void方法,一个Task在此时刻被归,因此调用者可以等待我们盖某种方式形成。C#啊务必存储一栽操作返回的Task的点子,这样当你的主意就,这个Task也转移得completed,并且执行者也足以返回到点子的异步链当中。确切的编制以会当第十四段中介绍。

上下文

  作为一个而await的长河尽量透明底局部,C#捕捉各种上下文在遇见await时,然后在恢复措施要将那个恢复。

  于有工作受到最要害的要么一头上下文(synchronization
context),即好给用于恢复措施在一个特别类型的线程上。这对于UI
app尤其重点,就是那种只能于是的线程上操作UI的(就是winform
wpf之类的)。同步上下文是一个扑朔迷离的话题,第八章用会见详细说明。

  其他门类的上下文也会见吃于当下调用的线程捕捉。他们之决定是经过一个同名称的好像来贯彻之,所以自己以列出一些要的光景文类型:

  ExecutionContext

  这是父级上下文,所有其他上下文都是它的一模一样片。这是.NET的体系功能,如Task使用那捕捉与传播上下文,但是它们自身不含什么表现。

  SecurityContext

  这是我们发现并找到日常被限定于眼前线程的平安信息的地方。如果您的代码用周转于一定的用户,你恐怕会,模拟或去这个用户,或者ASP.NET将会赞助你实现扮演。在这种状态下,模拟信息会是SecurityContext。

  CallContext(这个东西耳熟能详吧,相信用过EF的都晓得)

  这允许编程者存储他们以逻辑线程的生命周期中直接可用的数额。即使考虑到于博状况下出坏的呈现,它仍然可避程序中艺术的参数传来传去。(译者:因为若抱到callcontext里,随时都好落呀,不用通过污染参数传来传去矣)。LogicalCallContextis是一个息息相关的足跨用应用程序域的。

      
值得注意的凡线程本地存储(TLS),它同CallContext的对象一般,但其当异步的景象下是不做事之,因为在一个耗时操作中,线程被保释掉了,并且可能吃用于拍卖外事情了。你的法门也许被唤起并实施于一个两样之线程上。

  C#用会见于你方恢复(resume,这里就是是不过的“恢复”)的当儿恢复(restore,我觉着这里指从内存中还原)这些类别的上下文。恢复上下文将有局部支出,比如,一个主次于应用模拟(之前的仿身份之类的)的时段并大方施用async将会转换得重新慢有。我提议一定变.NET创建上下文的作用,除非你看这着实来必不可少。

await能为此在哪儿?

  await可以据此当另标志async的艺术及跟法外多数之地方,但是出一些地方你切莫能够因此await。我以解释为什么当一些情况下非容许await。

catch和finally块

  虽然于try块中行使await是一点一滴同意的,但是他无允以catch和finally块中以。通常在catch和finall块被,异常依然在库中无缓解的状态,并且之后用会晤为丢弃来。如果await在此时刻前使用,栈将会见有所不同,并且抛来十分的作为拿会转换得难以定义。

  请牢记替代以catch块中以block的点子是当其后面,通过返回一个布尔值来记录操作是否丢来一个雅。示例如下:

try
{
   page = await webClient.DownloadStringTaskAsync("http://oreilly.com");
}
catch (WebException)
{
   page = await webClient.DownloadStringTaskAsync("http://oreillymirror.com");
}

   你得以如下方式取代:

bool failed = false;
try
{
   page = await webClient.DownloadStringTaskAsync("http://oreilly.com");
}
catch (WebException)
{
   failed = true;
}
if (failed)
{
   page = await webClient.DownloadStringTaskAsync("http://oreillymirror.com");
}

  lock块

  lock是同等种植助编程人员防止其他线程和眼前线程访问同对象的方式。因为异步代码通常会放开始执行异步的线程,并且会受回调并且产生回调在一个不确定的时间量之后,即受放飞掉后及始发的线程不同(译者:即使同一之线程,它吗是假释掉后的了),所以于await上加锁没有其余意义。

  
以有些状况下,保护你的对象不让冒出访问是充分重点之,但是在无其余线程在await期间来走访你的对象,使用锁是从未有过必要的。在这些状况下,你的操作是发生头冗余的,显式地锁定了少数糟糕,如下:

lock (sync)
{
    // Prepare for async operation
}
    int myNum = await AlexsMethodAsync();
lock (sync)
{
    // Use result of async operation
}

  另外,你可以采用一个类库来开展拍卖并发控制,比如NAct,我们用会见于第十章介绍

  如果您不够幸运,你或要以履行异步操作时保持某种锁。这时,你就待苦思冥想并小心谨慎,因为普通锁住异步调用资源,而非招争用和死锁是死窘迫的。也许遇到这种景象想任何措施还是重构你的程序是极端好之选料。

  Linq Query表达式

  C#产生同栽语法帮助我们越来越便于之错过通过写querys来达成过滤,排序,分组等目的。这些query可以让实践于.NET平台及或者更换成为数据库操作还是其他数据源操作。

IEnumerable<int> transformed = from x in alexsInts
where x != 9
select x + 2;

  C#凡是在多数位置是不容许以Query表达式中以await关键字的。是坐这些位置会受编译成lambda表达式,正以这么,该lambda表达式需要标记为async关键字。只是这样含有蓄的lambda表达式不有,即使要确如此做也会为丁confuse。

  我们尚是生艺术,你可以写当量的表达式,通过使用Linq内部带来的拓方法。然后lambda表达式变得知道了不过读,继而你呢就是足以记他们吧async,从而采取await了。(译者:请对照上下代码来读)

IEnumerable<Task<int>> tasks = alexsInts
.Where(x => x != 9)
.Select(async x => await DoSomthingAsync(x) + await DoSomthingElseAsync(x));
IEnumerable<int> transformed = await Task.WhenAll(tasks);

  为了搜集结果,我使用了Task.WhenAll,这是啊Task集合所工作之家伙,我拿会当第七章介绍细节。

  不安全(unsafe)的代码

  代码被标记为unsafe的免克包含await,非安全的代码应该做到死少见而该保持方法独用和未欲异步。反正在编译器对await做转换的下啊会见跳出unsafe代码。(译者:我当其实这里并非太在意啦,反正没写了unsafe关键字的代码)

破获异常

  异步方法的深捕获被微软规划的尽心与我们如常同步代码一样的。然而异步的扑朔迷离意味着他们中间尚会略带细微差别。在此我以介绍异步如何简单的处理好,我呢用于第九章详见讲解注意事项。

  当耗时操作结束时,Task类型会起一个概念来表明成功或败诉。最简易的便是出于IsFaulted属性来为外暴露,在推行过程中产生异常它的值就是true。await关键字用见面发觉到当时一点又会废弃来Task中含有的充分。

           
如果你熟悉.NET异常机制,用或会担心生的仓库跟踪在废除来异常时怎样对的保存。这在过去恐是勿可能的。然而在.NET4.5受,这个限制让改动掉了,通过一个叫做ExceptionDispatchInfo的接近,即一个合作十分的捕捉,抛来和对的仓库跟踪的类。

  异步方法为能发现到好。在履行异步方法之间有任何特别,都不见面吃捕捉,他们见面趁机Task的回来而归给调用者。当起这种气象时,如果调用者在await这个Task,那么坏将会晤在此处抛出。(译者:之前起云到异常在异步中见面让传送)。在这种艺术下,异常通过调用者传播,会形成一个虚构的仓库跟踪,完全就比如它来在协同代码中平等。

           
我管其乘坐虚拟堆栈跟踪,因为堆栈是一个单线程拥有的这么的定义,并且于异步代码中,当前线程实际的库和发生大那个线程的库房可能是那个差之。异常捕捉的凡用户意图中之库跟踪,而未是C#什么样选执行这些方式的底细。

直至于得前面异步方法还是联合的

  我前说之,使用await只能消费(调用)异步方法。直到await结果产生,这个调用方法的语句以调用他们的线程中运作,就像一块方法一致。这生有现实意义,尤其是坐一个协办的历程一气呵成具有异步方法链时。(译者:当以await的时光,的确就是依合的逐一来推行)

  还记之前异步方法暂停在第一不善相遇await时。即使如此,它有时也非需暂停,因为有时await的Task已经成功了。一个Task已经深受得的景况如下:

  
·他是于创造好的,通过Task.FromResult工具方法。我们将见面在第七段详细探索。

   ·由没遇到async的async方法返回。

   ·它运行一个的确的异步操作,但是现在早就到位了(很可能是出于当下线程在遇见await之前都举行了少数事情)。

  
·它让一个遇上await的asunc方法返回,但是所await的斯前面便曾好了。

  由于最后一个可能性,一些妙趣横生的事体闹在您await一个都形成的Task,很可能是当一个深度的异步方法链中。整个链条很像全同的。这是坐于异步方法链中,第一独await被调用的计总是异步链最深的一个。其他的措施到达晚,最特别的不二法门才产生会回到。(
The others are only reached after the deepest method has had a chance to
return
synchronously.译者:按照语法来提我之立刻句话貌似翻译的未得法,但是本人个人觉得其实状况就是自我说之斯法。在遇见第一单await后,后面异步方法链中的await依次执行,逐个返回,最后才回来结果到绝可怜的方,也不怕是第一单艺术,有哲人来提出此的意吗?)

  
你或许会存疑为什么以第一栽要第二种植状态下还下async。如果这些办法承诺一直联手的返,你是无可非议的,并且这样描绘同步的代码效率超过异步并且没有await的历程。然后,这仅是方法并返回的情状。比如,一个办法缓存其结果及内存中,并当缓存可用之上,结果好让同步地赶回,但是当它需要异步的网络要。当您知发生一个吓会吃你利用异步方法,在某种程度上您或还想如果术返回Task或者Task<T>。(异步:既然方法链中产生一个假设异步,那么就会潜移默化总体都使用异步)。

描绘在最后

  关于异步我还有多困惑,也是随着文章逐步理解,我呢要会抢一些啊。