65.9K
CodeProject 正在变化。 阅读更多。
Home

不使用 MVC 的 Web API

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.93/5 (15投票s)

2014年5月7日

CPOL

5分钟阅读

viewsIcon

91414

downloadIcon

2591

在本文中,我们将开发一个独立的 API,它不与 ASP.NET MVC 应用程序类型耦合。

“Web API”,顾名思义,是一个 API,而 API 不应与任何特定类型的应用程序耦合。API 旨在提供服务,而不与消费者应用程序耦合。人们普遍误解,开发 Web API 必须遵循 ASP.NET MVC 应用程序。在本文中,我们将开发一个独立的 API,它不与 ASP.NET MVC 应用程序类型耦合。

什么是 Web API?

Web API 是一个构建 HTTP 服务的框架。开发的这些服务可以被广泛的客户端使用,包括浏览器和移动设备。

Web API 和 ASP.NET MVC

Web API 是 ASP.NET MVC 4 的一个功能。由于相似性,它包含在 MVC 4 中。这并不意味着您必须始终创建 ASP.NET MVC 应用程序来开发 Web API。您可以在任何数量的应用程序中使用 Web API。

在没有 MVC 的情况下开发 Web API

就服务开发而言,其理念是公开一些服务方法。我们不会关心应用程序类型。MVC 应用程序用于特定目的,其中我们也有一个消费者端。我们应该独立于其消费者来开发我们的服务。在本例中,我们将通过控制台应用程序开发一个 Web API。

在控制台应用程序中开发 Web API

在 MVC 之外开发 Web API 时,您需要将 Web API 程序集引用到您的项目中。NuGet 包管理器是将 Web API 程序集添加到非 ASP.NET 项目的最简单方法。

安装 Web API NuGet 包

  1. 从 **工具** 菜单中,选择 **程序包管理器**。
  2. 选择 **管理解决方案的 NuGet 程序包**。
  3. 在 **管理 NuGet 程序包** 对话框中,选择“联机”。
  4. 在搜索框中,键入“Microsoft.AspNet.WebApi.SelfHost”。
  5. 选择 ASP.NET Web API Self Host 程序包,然后单击“安装”。

安装完成后,您就可以在 MVC 之外开发 Web API 了。

启动 Visual Studio,从 **开始** 页中选择 **新建项目**。或者,从 **文件** 菜单中,选择 **新建**,然后选择 **项目**。在 **模板** 窗格中,在 **Visual C#** 下,选择 **控制台应用程序**。输入项目的名称,然后单击 **确定**。

添加一个文件 Product.cs 以创建业务模型类。我们将通过 Web API 公开此业务对象。

添加“Product”控制器

现在,我们需要添加 Web API。从技术上讲,Web API 方法只不过是一个Web API 控制器类。要添加控制器,请右键单击项目,然后选择 **添加新项**。在 **模板** 窗格中,选择 **已安装的模板**,然后展开 **Visual C#** 节点。在 **Visual C#** 下,选择 **Web**。选择 **Web API 控制器类**。输入类的名称,然后单击 **确定**。

添加控制器后,我们将找到带有自动生成代码的类

namespace WebAPISelfHost
{
    public class ProductController : ApiController
    {
        // GET api/<controller>
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }    

        // GET api/<controller>/5
        public string Get(int id)
        {
            return "value";
        }

        // POST api/<controller>
        public void Post([FromBody]string value)
        {
        }

        // PUT api/<controller>/5
        public void Put(int id, [FromBody]string value)
        {
        }

        // DELETE api/<controller>/5
        public void Delete(int id)
        {
        }
    }
}

在上面的代码中,控制器类已从 ApiController 类派生。这是 Web API 的关键类。如果我们想通过 API 公开控制器,我们必须从抽象类 ApiController 派生控制器。此外,还有四个自动生成的样板方法。这些是与 REST 的四种动词 GET、POST、PUT 和 DELETE 相关的样板方法。由于 Web API 是基于 REST 的,因此该框架为基于 REST 的 Web 服务提供了结构。

在我们的示例中,我们将开发一个简单的服务来获取产品详细信息。因此,删除自动生成的代码并实现一个 Web API GetProductList

namespace WebAPISelfHost
{
    public class ProductsController:ApiController
    {
        //[HttpGet]
        public List<Product> GetProductList()
        {
            List<Product> productLst = new List<Product>{
                new Product{ProductID="P01",ProductName="Pen",Quantity=10,Price=12},
                new Product{ProductID="P02",ProductName="Copy",Quantity=12,Price=20},
                new Product{ProductID="P03",ProductName="Pencil",Quantity=15,Price=22},
                new Product{ProductID="P04",ProductName="Eraser",Quantity=20,Price=27}
                                         };
            return productLst;
        }
    }
}

在我们的 API 中,我们只是返回一个产品列表。编译代码并生成项目。现在,我们的 Web API 已准备就绪。我们需要托管开发的 Web API。

自托管 Web API

您可以将 Web API 自行托管在自己的主机进程中。在这里,我们将自托管我们开发的 Web API 在控制台应用程序本身中。在项目中引用 System.Web.Http.SelfHost.dll。此库提供了 HTTP 自托管服务的类。

打开 Program.cs 文件并添加以下命名空间

using System.Web.Http;
using System.Web.Http.SelfHost;

现在,添加以下代码以进行自托管

static void Main(string[] args)
{
            var config = new HttpSelfHostConfiguration("https://:8080");
            config.Routes.MapHttpRoute(
                "API Default", "api/{controller}/{id}",
                new { id = RouteParameter.Optional });

            using (HttpSelfHostServer server = new HttpSelfHostServer(config))
            {
                server.OpenAsync().Wait();
                Console.WriteLine("Press Enter to quit.");
                Console.ReadLine();
            }
}

在上面的代码中,我们创建了 HttpSelfHostConfiguration 的一个实例。该类的重载构造函数需要一个 Uri 来侦听特定的 HTTP 地址。在 MapHttpRoute 方法中,我们定义了 API 的路由模式。

最后,我们在 HttpSelfHostServer 中使用该配置。我们的 Web API 是根据我们定义的配置进行托管的。

编译并运行项目。现在我们的 Web API 已启动并准备好提供服务。

注意:此应用程序侦听 https://:8080/。默认情况下,侦听特定的 HTTP 地址需要管理员权限。因此,当您运行应用程序时,可能会收到一条错误消息:“HTTP 无法注册 URL http://+:8080/”。要避免此错误,请使用提升的管理员权限运行 Visual Studio。

使用 Web API

现在是时候使用 Web API 了。让我们编写一个简单的控制台应用程序来调用 Web API。向解决方案添加一个新的控制台应用程序项目。

由于我们的 API 返回“product”类型的列表,因此我们需要添加一个样板 product 类来标识客户端代码中返回的类型。在客户端应用程序中添加 Product.cs 文件。

打开 Program.cs 文件。添加以下命名空间

using System.Net;
using System.Net.Http;
using System.Runtime.Serialization.Json;
using System.Net.Http.Formatting;
using System.Net.Http.Headers;
using EventStore.Serialization;

创建 HttpClient 类的实例,并使用 Web API 的侦听 Uri 设置基地址。

HttpClient client = new HttpClient ();
             client.BaseAddress = new Uri ("https://:8080/");

添加 accept header。这里我们使用了 HTTP 和 Web API 的一项功能,称为“**内容协商**”。根据此功能,客户端可以与服务器协商其返回的数据格式。这里,我们正在协商以 JSON 格式返回数据。

             // Add an Accept header for JSON format.
             client.DefaultRequestHeaders.Accept.Add(
                 new MediaTypeWithQualityHeaderValue("application/json"));

使用 HttpClient.GetAsync 方法向 Web API 发送 GET 请求。提供路由模式。

             // List all products.
             HttpResponseMessage response = client.GetAsync ("api/products").Result;

使用 ReadAsAsync 方法序列化响应。ReadAsAsync 方法返回一个 Task,该 Task 将产生指定类型的对象。

GetAsyncReadAsAsync 方法都是异步的。它们返回表示异步操作的 Task 对象。获取 Result 属性会阻塞线程直到操作完成。

            if (response.IsSuccessStatusCode)
             {
                 // Parse the response body. Blocking!
                 var products = response.Content.ReadAsAsync<IEnumerable<Product>>().Result;

最后,打印从 Web API 检索到的数据

                 foreach (var p in products)
                 {
                     Console.WriteLine("{0}\t{1};\t{2}", p.ProductID, p.ProductName, p.Quantity);
                     Console.ReadLine();
                 }
             }
             else
             {
                 Console.WriteLine("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase);
             }

生成并运行应用程序(服务器应用程序应已启动)。

您应该会看到以下输出

参考:

http://www.asp.net/web-api/overview/hosting-aspnet-web-api/self-host-a-web-api

© . All rights reserved.