www.188bet .com因为卡拉奇.NET俱乐部名义 的技术交流会圆满成功

这一次走本身与大家一致对社区依托了厚望,希望.NET社区的技术人士人人都可以成为人才,活动不断到6点才收,最终来平等布置我们一起大合照

用于 XML 和 JSON 的超媒体?

假诺本人在前文中所陈述,XML (application/­xml) 和 JSON
(application/json)
的通用媒体类型没有指向超媒体链接或者表单的搁协理。尽管可以使用域特定的定义(如“application/vnd-shoppingcart+xml”)扩大那个媒体类型,但是就要求新客户端询问在新品类中定义之具备语义(并还可能衍生媒体类型),因而一般不这么做。

见怪不怪因如此,有人指出了采纳链接语义扩张 XML 和 JSON
的新媒体类型指出,它叫也超文本应用程序语言 (HAL)。该草案在
stateless.co/hal_specification.html 上发布,它概括定义一个以 XML 和
JSON 表示过链接和放资源(数据)的正规方法。HAL
媒体类型定义包含一组属性、一组链接和同组嵌入资源的资源,如图 2
中所示。

www.188bet .com 1.png) 祈求 2 HAL
媒体类型


3
突显一个演示,它表达产品目录在又以 XML 和 JSON 表示情势之 HAL
中是呀法。图 4 是示例资源的 JSON 表示格局。

图 3
HAL 中之产品目录

  1. <resource href=”/products”>
  2. <link rel=”next” href=”/products?page=2″ />
  3. <link rel=”find” href=”/products{?id}” templated=”true” />
  4. <resource rel=”product” href=”/products/1″>
  5. <link rel=”add-cart” href=”/cart/” />
  6. <name>Product 1</name>
  7. <price>5.34</price>
  8. </resource>
  9. <resource rel=”product” href=”/products/2″>
  10. <link rel=”add-cart” href=”/cart/” />
  11. <name>Product 2</name>
  12. <price>10</price>
  13. </resource>
  14. </resource>

贪图 4
示例资源的 JSON 表示形式

  1. {
  2. “_links”: {
  3. “self”: { “href”:
    “/products” },
  4. “next”: { “href”:
    “/products?page=2” },
  5. “find”: { “href”:
    “/products{?id}”, “templated”: true }
  6. },
  7. “_embedded”: {
  8. “products”: [{
  9. “_links”: {
  10. “self”: { “href”:
    “/products/1” },
  11. “add-cart”: { “href”:
    “/cart/” },
  12. },
  13. “name”: “Product 1”,
  14. “price”: 5.34,
  15. },{
  16. “_links”: {
  17. “self”: { “href”:
    “/products/2” },
  18. “add-cart”: { “href”:
    “/cart/” }
  19. },
  20. “name”: “Product 2”,
  21. “price”: 10
  22. }]
  23. }
  24. }

www.188bet .com 2

支出用于 HAL 的 MediaTypeFormatter

HAL
以一定语义来表示资源以及链接,由此而不可知只是选取 Web API
实现中的另外模型。为之,大家下一个用来表示资源的基类和另外一个用以表示资源集的基类来假诺格式化程序的兑现再次简短:

  1. public abstract class LinkedResource
  2. {
  3. public List<Link> Links {
    get; set; }
  4. public string HRef { get; set; }
  5. }
  6. public abstract class LinkedResourceCollection<T> :
    LinkedResource,
  7. ICollection<T> where T : LinkedResource
  8. {
  9. // Rest of the collection
    implementation
  10. }

Web
API 控制器将运的实在模型类可由当时有限单基类派生。例如,一个出品依旧产品汇集好随以下方法实现:

  1. public class Product : LinkedResource
  2. {
  3. public int Id { get; set; }
  4. public string Name { get; set; }
  5. public decimal UnitPrice { get; set; }
  6. }
  7. public class Products :
    LinkedResourceCollection<Product>
  8. {
  9. }

现今,有矣概念 HAL
模型的正式方法,由此好实现格式化程序了。生成新的格式化程序实现的优良简便方法是起
MediaTypeFormatter 基类或 BufferedMediaTypeFormatter
基类派生。图 6 中之言传身教使用了亚个基类。


6 BufferedMediaTypeFormatter 基类

  1. public class HalXmlMediaTypeFormatter :
    BufferedMediaTypeFormatter
  2. {
  3. public HalXmlMediaTypeFormatter()
  4. : base()
  5. {
  6. this.SupportedMediaTypes.Add(new MediaTypeHeaderValue(
  7. “application/hal+xml”));
  8. }
  9. public override bool CanReadType(Type type)
  10. {
  11. return type.BaseType == typeof(LinkedResource) ||
  12. type.BaseType.GetGenericTypeDefinition() ==
  13. typeof(LinkedResourceCollection<>);
  14. }
  15. public override bool CanWriteType(Type type)
  16. {
  17. return type.BaseType == typeof(LinkedResource) ||
  18. type.BaseType.GetGenericTypeDefinition() ==
  19. typeof(LinkedResourceCollection<>);
  20. }
  21. }

欠代码首先以构造函数中定义襄助的是实现的传媒类型(“application/hal+xml”),然后再写
CanReadType 和 CanWriteType 方法以指定匡助的 .NET 类型,这多少个连串必须从
Linked­Resource 或 LinkedResourceCollection 派生。因为早已在构造函数中定义,此实现就协助 HAL 的 XML
变体。还足以实现其他一个格式化程序来支撑 JSON
变体(可选)。

实际工作在 WriteToStream 和 ReadFromStream
方法被就(如图 7 中所示),这多少个格局将分别拔取 XmlWriter 和
Xml里德r 来拿对象写入流或于流中读取对象。


7 WriteToStream 和 ReadFromStream 方法

  1. public override void WriteToStream(Type type, object value,
  2. System.IO.Stream writeStream, System.Net.Http.HttpContent content)
  3. {
  4. var encoding = base.SelectCharacterEncoding(content.Headers);
  5. var settings = new
    XmlWriterSettings();
  6. settings.Encoding = encoding;
  7. var writer = XmlWriter.Create(writeStream, settings);
  8. var resource = (LinkedResource)value;
  9. if (resource is IEnumerable)
  10. {
  11. writer.WriteStartElement(“resource”);
  12. writer.WriteAttributeString(“href”,
    resource.HRef);
  13. foreach (LinkedResource
    innerResource in
    (IEnumerable)resource)
  14. {
  15. // Serializes the resource state and links
    recursively
  16. SerializeInnerResource(writer, innerResource);
  17. }
  18. writer.WriteEndElement();
  19. }
  20. else
  21. {
  22. // Serializes a single linked resource
  23. SerializeInnerResource(writer, resource);
  24. }
  25. writer.Flush();
  26. writer.Close();
  27. }
  28. public override object ReadFromStream(Type type,
  29. System.IO.Stream readStream, System.Net.Http.HttpContent content,
  30. IFormatterLogger formatterLogger)
  31. {
  32. if (type != typeof(LinkedResource))
  33. throw new ArgumentException(
  34. “Only the LinkedResource type is
    supported”, “type”);
  35. var value = (LinkedResource)Activator.CreateInstance(type);
  36. var reader = XmlReader.Create(readStream);
  37. if (value is IEnumerable)
  38. {
  39. var collection = (ILinkedResourceCollection)value;
  40. reader.ReadStartElement(“resource”);
  41. value.HRef = reader.GetAttribute(“href”);
  42. var innerType = type.BaseType.GetGenericArguments().First();
  43. while (reader.Read() &&
    reader.LocalName == “resource”)
  44. {
  45. // Deserializes a linked resource
    recursively
  46. var innerResource = DeserializeInnerResource(reader, innerType);
  47. collection.Add(innerResource);
  48. }
  49. }
  50. else
  51. {
  52. // Deserializes a linked resource
    recursively
  53. value = DeserializeInnerResource(reader, type);
  54. }
  55. reader.Close();
  56. return value;
  57. }

最后一步是以格式化程序实现作为 Web API
宿主的一律片部署。此步骤几乎能够为此和以 ASP.NET 或 ASP.NET Web API
自托管中相同的办法来落实,只是所待的 HttpConfiguration
实现不同。就算自托管使用 HttpSelfHostConfiguration 实例,ASP.NET
常常接纳在 System.Web.Http.GlobalConfiguration.Configuration
中全局可用之 HttpConfiguration 实例。HttpConfiguration 类提供一个 Formatters
集合,您可拿它们注入自己之格式化程序实现。以下是何等对 ASP.NET 执行这操作:

  1. protected void Application_Start()
  2. {
  3. Register(GlobalConfiguration.Configuration);
  4. }
  5. public static void Register(HttpConfiguration config)
  6. {
  7. config.Formatters.Add(new
    HalXmlMediaTypeFormatter());
  8. }


ASP.NET Web API 管道中配置格式化程序后,任何控制器采纳 HAL
都可以简单地回来一个模子类,该型类从格式化程序要连串化的
LinkedResource 派生。对于产品目录实例,产品与表示目录的成品汇集好独家由
LinkedResource 和 LinkedResourceCollection 派生:

  1. public class Product : LinkedResource
  2. {
  3. public int Id { get; set; }
  4. public string Name { get; set; }
  5. public decimal UnitPrice { get; set; }
  6. }
  7. public class Products :
    LinkedResourceCollection<Product>
  8. {
  9. }

用以拍卖产品目录资源的享有请求的控制器
ProductCatalogController 现在好吧 Get 方法重返 Product 和 Products
的实例(如图 8 中所示)。


8 ProductCatalogController 类

  1. public class ProductCatalogController :
    ApiController
  2. {
  3. public static Products Products = new Products
  4. {
  5. new Product
  6. {
  7. Id = 1,
  8. Name = “Product 1”,
  9. UnitPrice = 5.34M,
  10. Links = new List<Link>
  11. {
  12. new Link { Rel = “add-cart”, HRef = “/api/cart” },
  13. new Link { Rel = “self”, HRef = “/api/products/1” }
  14. }
  15. },
  16. new Product
  17. {
  18. Id = 2,
  19. Name = “Product 2”,
  20. UnitPrice = 10,
  21. Links = new List<Link>
  22. {
  23. new Link { Rel = “add-cart”, HRef = “/cart” },
  24. new Link { Rel = “self”, HRef = “/api/products/2” }
  25. }
  26. }
  27. };
  28. public Products Get()
  29. {
  30. return Products;
  31. }
  32. }

此示例祭 HAL 格式,不过若还好运用类似措施来构建利用
Razor 的格式化程序及用模型连串化为 XHTML 的模板。您在
RestBugs 中得找到用于 Razor 的 MediaTypeFormatter
的有血有肉落实,该示例应用程序由 霍华德(Howard) Dierking 创造,演示怎么着使 ASP.NET
Web API 来创建超媒体 Web API,网址为
github.com/howarddierking/RestBugs

格式化程序一旦您得轻松利用新媒体类型扩充 Web API。   

二〇一七年3月13日的河内生在雨,一庙为费城.NET俱乐部名义的.NET技术交换会当微软Build
2017刚刚闭幕时以罗湖布吉路和翠山路会师处富基PARK国际6F进行,这一次交换为微软Build
2017 大会发布的.NET Standard 2.0 Preview1/.NET Core 2.0 Preview
1为契机,线上经过自我的公众号“DotNET跨平台”和豪门互换,每日我当万众号里筛选的2到3篇稿子推送给我们,都是经过缜密挑选的,不过看数量仅来2000暨3000。线下的活动好互换无线及无法发挥的始末,这次与人口领先了90单人口,有10几各如故由马尼拉、西安復苏的,有很多小兄弟没有报及名都来了,线上申请人数有100,要无是温哥华今生大雨,估量会再次多,要让咱热情之珠三角地区底.NET开发者一个掌声。本次活动MVP项目组和彼得给咱提供了众多拉(Dora)礼品,看案上张的满满的。

超媒体应运而生

链接始终是 REST 体系布局的严重性组件。当然,链接以比如浏览器的用户界面及下文中特别宽泛;例如,考虑使用“参见详细消息”链接来赢得目录中指定产品的详细新闻。但是并未用户界面或用户交互的统计机及电脑情状怎么惩罚为?大家以为,您为得以以那个情状被使超媒体项目。

动那新措施后,服务器不仅重临数据。它回到数据及超媒体项目。超媒体项目也客户端提供了一样种方法,使它可因服务器应用程序工作流的状态来规定可以当指定时间点实施之操作集合。

就是一般区分常规 Web API 和支撑 REST 的 API
的平地处,可是还存适用的另限制,由此于多数景下探讨 API 是否帮忙REST 可能无意思。我们只要关注的凡 API 能否正确用 HTTP
作为应用程序协议并尽可能用超媒体。通过启用超媒体,您可创立而自我意识的
API。这从没也免提供文档找借口,不过 API
在可更新性方面又活了。

足以什么超媒体项目重点由于所采用的传媒类型决定。我们眼前用于构建 Web API 的死多媒体类型(如 JSON 或
XML)和 HTML 一样,不提供表示链接或者表单的搁概念。您得由此定义表示超媒体的法门来行使这些媒体类型,不过及时要求客户端询问超媒体语义在这些达到是何等定义之。比较之下,诸如 XHTML (application/xhtml+xml) 或 ATOM
(application/atom+xml)
的媒体类型已襄助中的一对超媒体项目(如链接或者表单)。


HTML 中,一个链接由三只片构成: 一个对 URL
的“href”属性,一个征链接和当下资源事关的“rel”属性和一个可选的“type”属性(用于指定要求的传媒类型)。例如,假如假定用 XHTML
公开目录中之成品列表,资源负载可能接近于图 1 中所著之载荷。

祈求 1
使用 XHTML 公开产品列表

  1. <div id=”products”>
  2. <ul class=”all”>
  3. <li>
  4. <span class=”product-id”>1</span>
  5. <span class=”product-name”>Product 1</span>
  6. <span class=”product-price”>5.34</span>
  7. <a rel=”add-cart” href=”/cart” type=”application/xml”/>
  8. </li>
  9. <li>
  10. <span class=”product-id”>2</span>
  11. <span class=”product-name”>Product 2</span>
  12. <span class=”product-price”>10</span>
  13. <a rel=”add-cart” href=”/cart” type=”application/xml”/>
  14. </li>
  15. </ul>
  16. </div>

以此示例中,使用专业 HTML
元素表示产品目录,可是本人利用了 XHTML,因为这样一来使用任意现有 XML
库分析会爱多。而且当负载的同样有些,包含了一个锚点 (a)
元素,表示用于将该项添加到眼前用户购物车的链接。通过查该链接,客户端好由 rel
属性臆想该用法(添加新项),并以 href 用于对该资源 (/cart)
执行一个操作。请留心,链接由服务器按照这工作工作流来变化,由此客户端不需对另外URL 举办硬编码或估量任何规则。这也提供了以运转时修改工作流的新机会而不影响现有客户端。倘使目录中之随机产品缺货,服务器就需要忽略用于将该产品丰盛到打物车的链接即可。从客户端角度看,该链接不可用,由此不能订购该产品。服务器端可能应用了跟拖欠工作流有关的复复杂的规则,不过客户端根本察觉不顶就点,因为其唯一关注的事务是拖欠链接不在。由于超媒体和链接,客户端和服务器端的事体工作流已收回关联。

又,可以下超媒体和链接立异 API
设计之而是衍生和变化性。随着服务器上工作工作流的不断完善,它可以供用于新效用的另外链接。在我们的产品目录示例中,服务器可能含有一个初链接用于将成品标志为收藏项,如下所示:

  1. <li>
  2. <span class=”product-id”>1</span>
  3. <span class=”product-name”>Product 1</span>
  4. <span class=”product-price”>5.34</span>
  5. <a rel=”add-cart” href=”/cart/1″ type=”application/xml”/>
  6. <a rel=”favorite” href=”/product_favorite/1″
  7. type=”application/xml”/>
  8. </li>

虽然现有客户端可能忽略该链接并无让这多少个新功用的震慑,然而正如新的客户端好即刻开头采取该意义。这样,考虑吧您的 Web API 提供单个入口点或根 URL
也便不足吗惊异了,该入口点或根 URL 包含发现其他功效的链接。例如,您可具有一个 URL“/shopping_cart”,它回到以下
HTML 表示形式:

  1. <div class=”root”>
  2. <a rel=”products” href=”/products”/>
  3. <a rel=”cart” href=”/cart”/>
  4. <a rel=”favorites” href=”/product_favorite”/>
  5. </div>


OData 服务中也供类似功效,该功用在根 URL
中公然一个服务文档,该文档包含有辅助的资源聚合及用于获取与这个关系的数码的链接。

链接是连服务器和客户端的好方法,不过它存在一个醒目标题目。在有关产品目录的先示例中,HTML 中之一个链接只供
rel、href 和 type 属性,这暗含部分关于怎么着处理用 href 属性表示的该 URL
的牵动他知识。客户端应使用 HTTP POST 仍旧 HTTP GET?假诺它用
POST,应以伏乞主体中蕴含什么数据?固然有着知识或记录在某处,不过一旦客户端可实际发现该意义不更可以吗?对于拥有那个题材,使用 HTML
表单可以化解,它发出好多意思。

www.188bet .com 3

操作着之表单

使浏览器和 Web
交互时,平常采用表单表示操作。在产品目录示例中,按“添加到市物车”链接暗示将 HTTP GET
发送至服务器,它用回到一个而用来将产品增长到买入物车的 HTML
表单。该表单可以蕴涵一个带 URL 的“action”属性、一个象征 HTTP
方法的“method”属性与片可能要求用户输入的输入字段,还带有可读之存续操作的表达。

君得于微机及总结机情形被开同样的事情。如若未思通过人工和表单交互,您或许需要周转 JavaScript
或 C# 的应用程序。在产品目录中,用于访问第一单产品之“add-cart”链接的 HTTP
GET 将寻找用 XHTML 表示的以下表单:

  1. <form action=”/cart” method=”POST”>
  2. <input type=”hidden” id=”product-id”>1</input>
  3. <input type=”hidden” id=”product-price”>5.34</input>
  4. <input type=”hidden” id=”product-quantity” class=”required”>1</input>
  5. <input type=”hidden” id=”___forgeryToken”>XXXXXXXX</input>
  6. </form>

客户端应用程序现在既和涉及以产品增长到买入物车的一点详细消息撤除关联。它独自需要采用HTTP POST 将这表单提交至 action 属性中指定的 URL。服务器还得在表单中含有其他信息,例如,包含一个冒牌标记为制止过站点请求伪造
(CSRF) 攻击或者针对先为服务器填充的数量开展签约。

以此模型允许擅自 Web API
通过依照不同因素(如用户权限或客户端要使用的版)提供新表单来随便演化。

无图无真相、一贪图胜千言,来描写几张当场活动像,没有配置壁画师,都是交们为此手机照之:

当 ASP.NET Web API 中扶助超媒体

于前方文中,大家探究了于规划 Web API
时一旦准的局部超媒体原理。现在大家来精通一下什么样在动用 ASP.NET Web API
的生育条件受到实际执行这么些规律,并使此框架提供的所有可扩张性和职能。

当根本级别,ASP.NET Web API
匡助格式化程序的定义。格式化程序实现形式知道什么样处理特定媒体类型,以及怎样用她体系化或反体系化为实际的
.NET 类型。过去以 ASP.NET MVC
中针对新媒体类型的支撑好零星。只有 HTML 和
JSON 被视为有效成员并于方方面面堆栈中落完全协助。其余,没有用于协助内容商的相同模型。您可因而提供由定义 ActionResult
实现来支撑响应音信之异媒体类型格式,不过她不晓得如何引入新媒体类型来反而类别化请求音讯。利用有新的模子绑定程序仍旧值提供次的范绑定基础结构常常可以缓解者问题。幸运的凡,这种不一致性在 ASP.NET Web API
中一度通过引入格式化程序拿到解决。

每个格式化程序由基类
System.Net.Http.Formatting.MediaTypeFormatter 派生并更写方法
CanReadType/ReadFromStreamAsync 以支撑反连串化,重写方法
CanWriteType/WriteToStreamAsync 以补助用 .NET
类型序列化为指定的传媒类型格式。


5
显示 MediaTypeFormatter 类的概念。


5 MediaTypeFormatter 类

  1. public abstract class MediaTypeFormatter
  2. {
  3. public Collection<Encoding>
    SupportedEncodings { get; }
  4. public
    Collection<MediaTypeHeaderValue> SupportedMediaTypes { get; }
  5. public abstract bool CanReadType(Type type);
  6. public abstract bool CanWriteType(Type type);
  7. public virtual Task<object> ReadFromStreamAsync(Type type,
  8. Stream readStream,
  9. HttpContent content, IFormatterLogger formatterLogger);
  10. public virtual Task WriteToStreamAsync(Type
    type, object value,
  11. Stream writeStream, HttpContent content,
  12. TransportContext transportContext);
  13. }

格式化程序在 ASP.NET Web API
中对此支撑内容商于在关键效用,因为框架现在得以依照当呼吁信息之“Accept”和“Content-Type”标头中收取的价值选用正确的格式化程序。

ReadFromStreamAsync 和 WriteToStreamAsync
方法倚重任务并行库 (TPL) 来进行异步操作,因而其重返 Task
实例。假设您如若显式使格式化程序实现同步工作,基类
BufferedMediaTypeFormatter 将在中间也您执行是操作。此基类提供你可当落实着还写的点滴个道 SaveToStream 和
ReadFromStream,它们是 SaveToStreamAsync 和 ReadFromStreamAsync
的同版本。

www.188bet .com 4

超媒体(日常号称应用程序状态的引擎
(HATEOAS))是有血有肉状态传输 (REST) 的第一范围有。有平等种植观念认为超媒体项目(如链接或者表单)可用来讲明客户端怎么着跟同一组
HTTP 服务交互。这快速成为一个幽默之定义,在开可演化的 API
设计时会就此到它们。这和我们普通和 Web 交互的方没有其余例外。我们平时记住网站主页的一个入口点或
URL,然后运链接浏览网站的逐一不同区域。大家还使用表单,它附带预定义的操作依旧 URL
以提交网站举办某些操作所要的数据。

www.188bet .com 5

立马在得先控制以及精晓客户端应用程序数目的柜碰到少未会晤唤起问题。不过,当潜在客户端数上指数级增长时(就如时,数以千计的老三在应用程序在差不两只设备及运行),这样做就是无合适了。简单地于
SOAP 迁移至 HTTP 服务并无可以保证解决这几个问题。例如,假若当苟算 URL
的客户端上提供一些知识,问题按照会是,甚至从不 WSDL
之类的别样显式约定。超媒体可以助客户端屏蔽任何服务器移。

这一次运动第一潮实行,大家以会上吗发布了无数的见解,未能有会与的朋友,可以关心下一致不好走,适当的支配人口,适当增强运动报名费用(此次活动报名费5元),让我们的活动特别有效能。

总结

超媒体的意义特别强劲,允许客户端以及服务器独立演化。通过在不同等级采纳服务器提供的链接或者其他超媒体项目(如表单),客户端好成功与驱动交互的服务器业务工作流废除关联。

 

Pablo Cibraro 大凡国际直达公认的学者,在运用 Microsoft
技术计划及促成大型分布式系统方面具备领先 12 年的长经历。 他是团结系统
MVP。 如今 9 年惨遭,Cibraro 帮助广大 Microsoft
团队开发了片家伙及框架,以便为拔取 Web 服务、Windows Communication
Foundation、ASP.NET 和 Windows Azure 构建面向服务的应用程序。
他的博客地址是
weblogs.asp.net/cibrax,您得以
Twitter twitter.com/cibrax
上关注外。

原文:
http://msdn.microsoft.com/zh-cn/magazine/jj883957.aspx 

自我在吃我们介绍本次走开的张罗境况以及前程的计划,现场征求我们之观,为了给大家倒又持久,有序的上进,我们须是来团体的活动,这一次举行活动有幸得到了恋人提供的120容量的场所,可是这里距离河内的南山科技园如故极远矣,对于活动的开设效果或暴发接触影响,希望继续能找到南山科技园的移动场馆,我们可再一次好之交换。从5.1继先河策划本次走,重假使思念借微软build大会暨自我多年来平年开发.NET
Core应用之涉,提前和各位分享.NET
Core技术怎么当温馨的干活吃错过落地,5.5如泣如诉经活动性网站发出活动报名(http://www.huodongxing.com/event/7385969654700)在微信群里大概的倒车了,报名就早已达成65人口,5.6每当万众号里推送一下,半时后固然提请满了,临时扩展20只报名名额及100丁,也当随之的一个时售罄。大家很之古道热肠打电话过来问我是否仍可以够报名与。感有参预本次线下走之美好小弟漂亮的女生,90%的插手率实在是大家没想象到之,这为正好表达了自家的一个收费5头之考虑:
免费之位移,通过网上申请的计很的粗略,无论去非失,先管名报上,到平常莫错过一些损失也远非,可是这倒是深受主办方带来了很分外之损失,想加入的人口到非了,所以事后我们办活动必将如果收费,哪怕是如自家这么象征性的收款5初次,过滤掉这多少个捣蛋鬼。据说同样的微软官方进行的免费Build
夜趴会加入率只来50%。

应用程序状态工作流也承诺放在服务器端,它规定客户端接下来好举办什么。假定资源被之一个操作才对点名状态可用,该逻辑是不是应进驻留于自由可能的
API 客户端?肯定挺。服务器应尽控制得本着资源执行什么操作。例如,假使废除打订单
(PO),就无应允允许客户端应用程序提交该
PO,这象征在殡葬到客户端的响应中应不可以以提交该 PO
的链接或者表单。

MVP罗勇先生在给我们大饱眼福《基于Dynamics
365及Ionic的活动支付执行》,给我们介绍微软的Dynamics
365之位移支付方面的知识,我们听的好认真,罗先生还带了众新疆特产受大家品尝,大家想进什么新疆绝活得以间接搜索他,他还有一个业内Dynamics
CRM的特斯拉号微软动态CRM专家罗勇,他会见定期推出原创作品,同时还相会追加翻译连串,逐渐的翻Dynamics
365 SDK,用户手册、管理员手册等,所以即使是勿相会Dynamic
365开发技术的您,也值得关注。

每当 Web API 控制器中提供再好之链接匡助

初步的 ProductCatalog­Controller
示例肯定有不妥的处在。其中的有链接都硬编码了,即使路由平日转移,会使得人胸口痛不已。幸好框架提供了名为也 System.Web.Http.Routing.UrlHelper
的扶植器类来机关从路由表揣度链接。通过 Url
属性在 ApiController
基类中提供此类的实例,由此好当旁控制器方法被轻松利用它们。UrlHelper
类定义类似于:

  1. public class UrlHelper
  2. {
  3. public string Link(string routeName,
  4. IDictionary<string, object> routeValues);
  5. public string Link(string routeName, object routeValues);
  6. public string Route(string routeName,
  7. IDictionary<string, object> routeValues);
  8. public string Route(string routeName, object routeValues);
  9. }

Route
方法再次回到指定路由于的相对 URL(例如 /products/1),Link 方法重回绝对URL(可以于模型中运用该 URL 来避免硬编码)。Link
方法接收两单变量: 路由名称和如组成 URL 的价值。


9
呈现对从前的产品目录示例,如何在 Get 方法被应用 UrlHelper
类。

贪图
9 咋样在 Get 方法吃接纳 UrlHelper 类

  1. public Products Get()
  2. {
  3. var products = GetProducts();
  4. foreach (var product in products)
  5. {
  6. var selfLink = new Link
  7. {
  8. Rel = “self”,
  9. HRef = Url.Route(“API Default”,
  10. new
  11. {
  12. controller = “ProductCatalog”,
  13. id = product.Id
  14. })
  15. };
  16. product.Links.Add(selfLink);
  17. if(product.IsAvailable)
  18. {
  19. var addCart = new Link
  20. {
  21. Rel = “add-cart”,
  22. HRef = Url.Route(“API Default”,
  23. new
  24. {
  25. www.188bet .com,controller = “Cart”
  26. })
  27. };
  28. product.Links.Add(addCart);
  29. }
  30. }
  31. return Products;
  32. }

曾以控制器名称 ProductCatalog 和活 ID
从默认路由特别成了产品的链接“self”。还打默认路是因为中生成了用于将产品增长到买入物车的链接,只是下的控制器名称为
Cart。如图 9
中所突显,用于将产品充足到买入物车的链接按照产品可用性 (product.IsAvailable)
与响应关联。向客户端提供链接的逻辑紧要因让一般性在控制器中实践之政工规则。

www.188bet .com 6

开发人士倾向在劳务碰着提供有帮忙之艺术的静态描述,从专业预约(如
SOAP 服务着之 Web 服务描述语言 (WSDL))到不超媒体 Web API
中之概括文档都是那般。这样做的要紧问题是静态 API
描述将客户端与服务器紧密关系。简单的说,它阻挡了但衍变性,因为 API
描述着之另外改变都或半途而废所有现有客户端。

Leave a Comment.