RESTful Web Services in .NET

在当今的互联网世界中,RESTfulWeb Services已经成为构建网络应用的标准方式之一。它们提供了一种简洁、灵活的方式来处理HTTP请求。尽管有许多关于.NET和C#的Web Services的资源,但很少有资源能够提供一个简单且符合.NET风格的框架。本文旨在介绍一个小型框架,它基于REST,并主要针对.NET版本3.5及更早版本。

使用代码

如同网络上关于REST和.NET的其他文章一样,本文的实现涉及通过一个IHttpHandler来处理特定的资源请求。在这个例子中,使用的是PoC.Web.Services.ReSTServiceHandler。这个IHttpHandler将处理REST调用(Get, Put, Post, Delete)并适当地分派它们。为了添加这个处理器,必须在web.config文件中添加以下几行代码:

<system.web> <httpHandlers> <add verb="*" path="RESTService/*" type="PoC.Web.Services.ReSTServiceHandler, PoC.Web.ReSTService" /> <add verb="*" path="RESTService/*/*" type="PoC.Web.Services.ReSTServiceHandler, PoC.Web.ReSTService" /> </httpHandlers> </system.web>

该库提供了两种机制来创建RESTWeb Services

  • IReSTService:类似于Web Service模型,需要将需要暴露的方法标注出来。
  • IReSTFulService:提供四个处理请求的调用:Get, Put, Post, Delete。

以下是一个实现了IReSTService的Calculator类的示例:

public class Calculator : PoC.Web.Services.IReSTService { [PoC.Web.Services.ReSTMethod(PoC.Web.Services.HttpVerb.Get)] public int Sum(int a, int b) { return a + b; } [PoC.Web.Services.ReSTMethod(PoC.Web.Services.HttpVerb.Get)] public int Multiply(int a, int b) { return a * b; } [PoC.Web.Services.ReSTMethod(PoC.Web.Services.HttpVerb.Get)] public int Subtract(int a, int b) { return a - b; } }

在这个例子中,有一个Calculator类,它实现了IReSTService并通过标注方法来暴露三个方法。ReSTMethod属性需要指定该方法上允许的动词。构建完成后,可以通过以下URL访问CalculatorService:

  • 求和URL: http://<servername/localhost>/<web app>/RESTService/Calculator/Sum?a=-1&b=2
  • 乘法URL: http://<servername/localhost>/<web app>/RESTService/Calculator/Multiply?a=195&b=21
  • 减法URL: http://<servername/localhost>/<web app>/RESTService/Calculator/Subtract?a=-12&b=2

这个接口有以下方法:

object GetCall(string args, HttpContext context); object PutCall(string args, HttpContext context); object PostCall(string args, HttpContext context); object DeleteCall(string args, HttpContext context);

以下是一个示例:

public class Parts : PoC.Web.Services.IReSTFulService { // ... public object GetCall(string arg, HttpContext context) { if (string.IsNullOrEmpty(arg)) { return allParts; // typeof Parts[] } else { return filteredParts; // typeof Parts[] } } public object PutCall(string arg, HttpContext context) { Part ps = null; // Get Part try { ps = PoC.Web.Services.Utilities.TypeConversion.Deserialize<part>(context.Request.InputStream); } catch (Exception ex) { // Bad Stream throw new PoC.Web.Services.InternalErrorException(503, "Bad Stream"); } return UpdatePart(ps); // let's say string } public object PostCall(string arg, HttpContext context) { Part ps = null; // Get Part try { ps = PoC.Web.Services.Utilities.TypeConversion.Deserialize<part>(context.Request.InputStream); } catch (Exception ex) { // Bad Stream throw new PoC.Web.Services.InternalErrorException(503, "Bad Stream"); } return InsertPart(ps); } public object DeleteCall(string arg, HttpContext context) { throw new PoC.Web.Services.InternalErrorException(503, "Method Not Supported"); } // ... }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485