在当今的互联网世界中,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的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:
这个接口有以下方法:
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");
}
// ...
}