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

C# 如何为使用其他API的web服务创建控制器,c#,asp.net,web-services,rest,visual-studio-2012,C#,Asp.net,Web Services,Rest,Visual Studio 2012,我已经阅读了微软关于RESTfulAPI的教程,虽然我对如何创建RESTfulAPI有一个大致的了解,但我对我应该做什么还不清楚 场景:我有一个单独的Windows程序,其中包含一个可以使用C#编写的API。该程序的工作是获取一系列位置并返回这些位置的里程数。为此使用了DLL。我想创建一个单独的程序(C#中的RESTFUL web服务),用户可以通过URL输入值以获得里程数。用户最多可以输入2个或20个位置。还有不同类型的里程(模块),可用于返回不同类型的里程(单独的windows程序处理此问题

我已经阅读了微软关于RESTfulAPI的教程,虽然我对如何创建RESTfulAPI有一个大致的了解,但我对我应该做什么还不清楚

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

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

我不太确定如何实现这一点。我班上应该有什么?我的控制器中到底应该有什么?我想我可以有一个类来跟踪一个位置的所有属性


我最关心的也是控制员。我不知道如何编写它,因为我不知道URI应该是怎样的。我认为像/mileagetype/loc1/loc2/loc3/locx这样的uri。。。可能太长了,因为用户最多可以输入20个位置。

您可以创建WCF Rest WebService以将功能与应用分离。在创建rest完整Web服务时,请看一下这一点,您可以轻松地使用Web Api 2.0实现这一点。这正是它的目的,并且非常适合您的用例

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

例如,在客户端,他们可以向您传递一个完整的复杂JSON对象,该对象包含您提到的所有属性。在服务器端(在WebAPI项目中),您可以拥有一个数据传输对象,其唯一目的是绑定到来自客户端的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;
    }
}
我不会太担心URL会持续多长时间,因为这不是一个真正的问题 它很可能由客户机使用者生成,并用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
    }
您的控制器可以如下所示:

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
    }

好的,我喜欢这个教程。事实上,它发现它比微软的要好。哈哈。但是,如果您不创建数据库呢?如果您只是让另一个API计算数据呢?Rest WebServices是无状态的,但是如果您不想使用db,那么您可以在项目中使用简单的硬代码值。很抱歉问21个问题。。。但是最好让用户的客户端以/calculate/mileagetype/loc1/loc2/loc3或/calculate/mileagetype的形式运行URI吗?loc=1&loc=2&loc=3。。。?或者两者都没有?我担心的是,用户一次最多可以输入20个位置。此外,本教程似乎只演示了如何执行第一个,而不是后一个。特别是,您可以使用该文章中的get方法。您知道有任何类似于您提供的教程,在Visual Studio 2012中更为循序渐进吗?您知道如何添加DLL并在代码中使用它吗?当然知道。在创建web api项目后,您可以像添加任何其他DLL一样在visual studio中添加它。转到“引用”并右键单击“添加”。然后在控制器内部为其名称空间添加using语句。然后从中找到所需的函数。