2KB项目,专业的源码交易网站 帮助 收藏 每日签到

使用 ASP.NET 和 WCF 4.0 开发 RESTful 服务

  • 时间:2019-01-23 18:41 编辑:2KB 来源:2KB.COM 阅读:343
  • 扫一扫,手机访问
  • 分享
摘要: 英文原文:Dev
英文原文:Developing RESTful Service with WCF 4.0 using ASP.NET

简介

Windows Communication Foundation (WCF) 是一个用来在Windows上开发和实现服务的SDK。WCF为你的服务提供了Runtime环境,使得你能够将CLR类展开成服务,并且可以把其他服务当做CLR类来试用。在这篇文章中,我将解释如何使用WCF4.0来实现“REST”的服务API。

什么是REST?

根据Roy Fielding的理论:“Representational State Transfer (REST),尝试将结构化的样式标准化,并设计出使得Web名副其实的约束条件。REST强调概念和层次的划分、无状态和存储这类的东西,这类东西以他们提供的优势,而在许多分布式的体系结构中十分常见。这些优势包括交互性、独立的改进、拦截、改进的可扩展性、效率以及总体上的性能。”

实际上区别仅仅是客户端访问我们的服务的方式。通常的,一个WCF服务会使用SOAP,但是如果你构建了一个REST服务,客户端会使用一个不同的结构样式来访问你的服务(调用,如JSON一般的序列化,等等)。

REST使用一些常见的HTTP方法来插入、删除、更新、返回信息,这些方法如下:

  1. GET - 请求针对资源的特定表达式
  2. PUT - 根据提供的表达式创建或者更新一个资源
  3. DELETE - 删除指定的资源
  4. POST - 提交数据来让指定的资源处理

为什么使用REST,以及在哪里使用?

几天之前,我正在编写一个服务,它能够支持多种语言、平台或系统的访问。它可以被iPhone、Android、Windows Phone、.Net Web应用、Java或者PHP所使用。使用Web服务,使用统一的系统来将它展现给每个人,这对我来说有点复杂。之后,我决定使用REST,它更容易支持云。这是一个很好的例子,它表明了简单的“REST”的服务 :)。下面是一些重点,他们能够帮助你理解为什么使用“REST”的服务。

  1. 更少的开销(对于每次调用不需要包裹SOAP外壳)
  2. 更少的重复(HTTP已经提供了诸如DELETE、PUT、GET等等的方法,否则将表现在一个SOAP外壳当中)。
  3. 更标准化 - HTTP方法很容易理解并且操作一致。一些SOAP实现可能变得过分挑剔。
  4. 对于人类有更强的可读性和可测试性(很难仅仅用一个浏览器来测试SOAP)。
  5. 不需要使用XML(好吧,对于SOAP貌似也不需要使用,不过这很难成立,因为你已经开始解析外壳了)
  6. 库使得SOAP(有点)容易。但正如我提到的,你正在抽出大量的底层冗余。确实,在理论上,在避免装载功能相同的顶层这一项上,SOAP能够超过其他的转换;但是在现实中你可能做的几乎所有SOAP工作,都是通过HTTP的。

一步一步的指导

第一步:

创建名为WCFClasses的类库。在类库中创建类。

1. IGasPriceService.cs

WCF操作数据契约的代码如下:

[ServiceContract]
public interface IGasPriceService
{
    [OperationContract]
    [WebGet
        (ResponseFormat = WebMessageFormat.Xml,
        BodyStyle = WebMessageBodyStyle.Bare,
        UriTemplate = "/GetGasPrice/For/ZipCode/{zipCode}"
        )]
    GasPriceData GetPriceByZipCode(string zipCode);

    [OperationContract]
    [WebGet
        (RequestFormat = WebMessageFormat.Xml,
        ResponseFormat = WebMessageFormat.Xml,
        BodyStyle = WebMessageBodyStyle.Bare,
        UriTemplate = "/GetGasPrice/For/City/{city}"
        )]
    GasPriceData GetPriceByCity(string city);
}

WebGet属性

WebGet属性让我们能够定制在处理REST服务的过程中,如何处理HTTP的GET方法。如例子所示,我们在URL中呈现GET方法,并且我们期待返回一些POX(简单的旧式XML)结果。

  • 请求格式:是发起请求的格式。两个选项是XML和JSON。如果你从浏览器请求,你的请求将会被重视。
  • 响应格式:是返回的格式。两个选项是XML和JSON。在这里我们定制我们想要通过XML返回。
  • 数据体样式:展现了我们希望怎样返回数据。我们希望没有XML还是全都“乱成一团”的XML?
实例 :

裸格式:

<GasPriceData>
    <GasStation>HP</GasStation>
    <Price>459</Price>
</GasPriceData>
有包装的格式:
<GetPriceDataResponse>
    <GetPriceDataResult>
        <a:GasStation>HP</a:GasStation>
        <a:Price>459</a:Price>
    </GetPriceDataResult>
</GetPriceDataResponse>

UriTemplate描述了我们将如何处理 Uri映射。这个例子中,我们声明了基地址(BaseAddress)之后的URL看起来是下面这样的:
 /GetGasPrice/For/ZipCode/{zipCode}

这就是服务合同,为我们REST服务实现了两个方法。一个通过城市名字得到天然气价格,另一个通过邮政编码获得。

Class 2: GasPriceService.cs

这个类是用来将数据返回给服务端。在现实场景中,它可能会连接到一些可以返回数据的数据存储区。

using System.ServiceModel.Activation;

namespace WCFClasses
{
    [AspNetCompatibilityRequirements(
        RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class GasPriceService : IGasPriceService
    {
        #region Members

        public GasPriceData GetPriceByZipCode(string zipCode)
        {
            switch (zipCode)
            {
                case "00000":
                    return new GasPriceData { GasStation = "None", Price = 0.00m };
                case "12345":
                    return new GasPriceData {GasStation = "HP", Price = 420m};
                case "11111":
                    return new GasPriceData {GasStation = "Indian Oil", Price = 531m};
                default:
                    return new GasPriceData {GasStation = "DefaultGasPrice", Price = 400m};
            }
        }

        public GasPriceData GetPriceByCity(string city)
        {
            switch (city.ToLower())
            {
                case "hyderabad":
                    return new GasPriceData { GasStation = "HP", Price = 459m };
                case "delhi":
                    return new GasPriceData { GasStation = "Indian Oil", Price = 449m };
                case "chenni":
                    return new GasPriceData { GasStation = "BG", Price = 499m };
                default:
                    return new GasPriceData { GasStation = "DefaultGasPrice", Price = 409m };
            }
        }

        #endregion
    }
}

Class 3: GasPriceData.cs

举个用途例子,本端携带有天然气价格数据。当然作为一个实际的服务,这应该被实现为一个更健壮的对象模型。

using System.Runtime.Serialization;

namespace WCFClasses

{
    [DataContract]
    public class GasPriceData
    {
        [DataMember]
        public string GasStation { get; set; }

        [DataMember]
        public decimal Price { get; set; }
    }
}

第2步

创建另一个Web应用程序项目命名为WebApplication1

托管代码如下:

  1. 添加 Global.asax

    代码:Application_Start中:

    protected void Application_Start(object sender, EventArgs e)
    {
        System.ServiceModel.Activation.WebServiceHostFactory WSHF = 
          new System.ServiceModel.Activation.WebServiceHostFactory();
    
        System.ServiceModel.Activation.ServiceRoute ss = 
          new System.ServiceModel.Activation.ServiceRoute(
          "wcfservice", WSHF, typeof(WCFClasses.GasPriceService));
        System.Web.Routing.RouteTable.Routes.Add(ss);
    
    }
  2. web.config
    <configuration>
        <system.web>
            <compilation debug="true" targetFramework="4.0" />
        </system.web>
      <system.serviceModel>
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true" 
                 multipleSiteBindingsEnabled="true" />    
      </system.serviceModel>
    </configuration>   


服务准备测试现在

现在如果我用http://localhost:1486/wcfservice/GetGasPrice/For/ZipCode/11111 地址,我的浏览器得到的是下面的响应,它是XML格式的,正是我要达到的目标。

任何意见,建议,和批评都很欢迎。

本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。 2KB翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。


2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务

  • 全部评论(0)
资讯详情页最新发布上方横幅
最新发布的资讯信息
【计算机/互联网|】Nginx出现502错误(2020-01-20 21:02)
【计算机/互联网|】网站运营全智能软手V0.1版发布(2020-01-20 12:16)
【计算机/互联网|】淘宝这是怎么了?(2020-01-19 19:15)
【行业动态|】谷歌关闭小米智能摄像头,因为窃听器显示了陌生人家中的照片(2020-01-15 09:42)
【行业动态|】据报道谷歌新闻终止了数字杂志,退还主动订阅(2020-01-15 09:39)
【行业动态|】康佳将OLED电视带到美国与LG和索尼竞争(2020-01-15 09:38)
【行业动态|】2020年最佳AV接收机(2020-01-15 09:35)
【行业动态|】2020年最佳流媒体设备:Roku,Apple TV,Firebar,Chromecast等(2020-01-15 09:31)
【行业动态|】CES 2020预览:更多的流媒体服务和订阅即将到来(2020-01-08 21:41)
【行业动态|】从埃隆·马斯克到杰夫·贝佐斯,这30位人物定义了2010年代(2020-01-01 15:14)
联系我们

Q Q: 7090832

电话:400-0011-990

邮箱:7090832@qq.com

时间:9:00-23:00

联系客服
商家入住 服务咨询 投拆建议 联系客服
0577-67068160
手机版

扫一扫进手机版
返回顶部