如何为使用其他API的Web服务创建控制器

时间:2014-07-15 18:44:49

标签: c# asp.net web-services rest visual-studio-2012

我已经阅读了微软关于RESTFUL API的教程,虽然我对如何创建一个API有一般性的了解,但我对我应该做什么感到很遗憾。

场景:我有一个单独的Windows程序,其中包含可以在C#中编写的API。该计划的工作是采取一系列地点并返回这些地点的里程数。 DLL用于此目的。我想创建一个单独的程序(C#中的RESTFUL Web服务),用户可以通过URL输入值来获取里程。用户最多可以输入2或20个位置。还有不同类型的里程(模块)可用于返回不同类型的里程(单独的Windows程序处理此问题)。

位置将具有以下属性:ID,城市,县,州,邮政编码。

我不确定如何实现这一点。我班上应该怎么办?我的控制器到底应该是什么?我以为我可以有一个单独的类来跟踪某个位置的所有属性。

我最关心的还有控制器。我不知道怎么写它,因为我不知道URI应该如何。我认为uri like / mileagetype / loc1 / loc2 / loc3 / locx ...可能过于冗长,因为用户最多可以输入20个位置。

2 个答案:

答案 0 :(得分:1)

您可以创建WCF Rest Web服务以从您的应用中分离出功能。请查看此article以创建restful webservices

答案 1 :(得分:0)

您可以轻松使用Web Api 2.0。这是它的用途,非常适合您的用例。

Getting started with Web Api 2.0 from Microsoft

您的Web API控制器只包含端点,通过URI到外部世界,然后您将转到DLL以获取所有实际逻辑。

例如,在客户端,他们可以传递一个包含您提到的所有属性的完整复杂JSON对象。在服务器端(在Web API项目中),您可以拥有一个数据传输对象,其唯一目的是绑定到来自客户端的JSON数据。

一个简单的解决方案:

在服务器上,处理端点的控制器看起来像下面的示例,用于非常简单的GET请求。

public class MileageServiceController : ApiController
{

    // GET: api/MileageService?locations=100NewYork&locations=300NewJersey
    public string Get([FromUri] String[] locations)
    {
        String value = String.Empty;
        //TO DO - GOT TO DLL and get milage
        foreach (String loca in locations)
        {
            //you could go to your DLL here 
            //value += DLL.GetMilage(loca.ID, loca.City, etc...
            value += loca; //for testing
        }
        return value;
    }
}

我不会过分担心网址会花多长时间,因为这不是真正的问题 它很可能是由客户消费者生成的,它将用JavaScript或任何其他编程语言实现。

更优雅的解决方案:

对于更优雅的解决方案,您可以在服务器端API上创建DTO(数据传输对象)。 然后,您可以通过POST从客户端传递复杂对象。

您的DTO可能如下所示:

public class Location
{
    public int ID {get; set;}
    public string City {get; set;}
    public string County {get; set;}
    public string State {get; set;}
    public int ZipCode { get; set; }
}

您的控制器可能如下所示:

    // POST: api/MileageService - accept an array of location DTO's
    public void Post([FromBody]Location[] locations)
    {
        //Go to DLL and figure out milage for each DTO
    }

More on complex types and web API