添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

ASP.NET Web API 是一种框架,用于轻松构建可以访问多种客户端(包括浏览器和移动 设备)的 HTTP 服务。 ASP.NET Web API 是一种用于在 .NET Framework 上构建 RESTful 应用程序的理想平台。

ASP.NET Web API 是 OWIN 兼容的, 因此可以在 OWIN 服务器上运行。

接下来使用 Xamarin Studio 创建一个 OWIN 兼容的 C# 类库, 也就是 OWIN 中定义的“应 用 (Application)” , 然后在不同的 OWIN 服务器/宿主上运行。

创建 OWIN 兼容的 Web API 类库

打开 Xamarin Studio, 新建一个 C# 类库项目, 如下图:

然后向项目中添加 Microsoft.AspNet.WebApi.Owin 包, 相关依赖的包会自动添加,

最终项目依赖的包如下表, 如果没有在 packages.config 文件中列出, 可以再次手工添

  • Microsoft.AspNet.WebApi.Client
  • Microsoft.AspNet.WebApi.Core
  • Microsoft.AspNet.WebApi.Owin
  • Microsoft.Owin
  • Newtonsoft.Json
  • 我们的目的是创建 OWIN 兼容的 Web API 应用, 自然要先添加一个 OWIN 约定的 Startup 类, 来配置我们的 OWIN 应用。

    向项目中添加一个 Startup 类 , 代码如下:

    public class Startup {
        public void Configuration(IAppBuilder appBuilder) {
            // 创建 Web API 的配置
            var config = new HttpConfiguration();
            // 启用标记路由
            config.MapHttpAttributeRoutes();
            // 默认的 Web API 路由
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            // 将路由配置附加到 appBuilder
            appBuilder.UseWebApi(config);
    

    按照 Web API 项目的约定, 在项目中添加一个名称为 Controllers 的文件夹, 然后新建 一个 ValuesController 类, 设置其基类为 System.Web.Http.ApiController , 作为示 例, 其内容与 Visual Studio 自带的 Web API Controller 模板一致, 如下所示:

    public class ValuesController : ApiController {
        // GET api/values
        public IEnumerable<string> Get() {
            return new string[] { "value1", "value2" }; 
        // GET api/values/5
        public string Get(int id) {
            return "value"; 
        // POST api/values
        public void Post([FromBody]string value) {
        // PUT api/values/5
        public void Put(int id, [FromBody]string value) {
        // DELETE api/values/5
        public void Delete(int id) {
    

    在 OWIN 环境下运行 Web API

    OWIN 目前有兩個比较成熟的服务器:

  • Katana 微软的 OWIN 服务器, 如果没有指定 OWIN 服务器, 则作为默认的 OWIN
  • Nowin 社区版 OWIN 服务器, 纯 C# 实现, 可以运行在 .NET 和 Mono 运行。
  • 使用 Katana 服务器运行

    在 Katana 下运行 OWIN 应用是很容易的, 新建一个命令行程序项目, 项目名称为: Owin02_WebApi_Katana , 然后向项目中添加下面的 NuGet 包:

  • Microsoft.AspNet.WebApi.Client
  • Microsoft.AspNet.WebApi.Core
  • Microsoft.AspNet.WebApi.Owin
  • Microsoft.AspNet.WebApi.OwinSelfHost
  • Microsoft.Owin
  • Microsoft.Owin.Host.HttpListener
  • Microsoft.Owin.Hosting
  • Newtonsoft.Json
  • 在默认的 Program.cs 文件的 Main 方法中, 添加下面的代码:

    public static void Main(string[] args) {
        var baseAddress = "https://localhost:9000/";
        var startOpts = new StartOptions(baseAddress) {
            // katana http listener
            ServerFactory = "Microsoft.Owin.Host.HttpListener"
        using (WebApp.Start<Owin02_WebApi.Startup>(startOpts)) {
            var client = new HttpClient {
                BaseAddress = new Uri(baseAddress, UriKind.Absolute)
            var requestTask = client.GetAsync("api/values");
            requestTask.Wait();
            var response = requestTask.Result; 
            Console.WriteLine(response);
            var readTask = response.Content.ReadAsStringAsync();
            readTask.Wait();
            Console.WriteLine(readTask.Result);
            Console.ReadLine();
    

    现在运行 Owin02_WebApi_Katana 项目, 命令行显示如下:

    也可以通过浏览器来访问 https://localhost:9000/api/values , 得到的结果如下:

    使用 Nowin 服务器运行

    OWIN 兼容的应用可以在任何 OWIN 服务器上运行, 下面就看看如何在 Nowin 上运行。

    最简单的方法是将上面代码中 StartOptions 的 ServerFactory 属性设置为 Nowin , 然 后在添加 Nowin 包就可以运行了:

    var baseAddress = "https://localhost:9000/";
    var startOpts = new StartOptions(baseAddress) {
        // Nowin
        ServerFactory = "Nowin"
    

    不过这样会依赖包 Microsoft.Owin.Hosting , 其实 Nowin 自身也提供了 Hosting 的 功能, 下面就看如何直接从 Nowin 启动。

    新建一个 C# 命令行程序, 项目名称为 Owin02_WebApi_Nowin , 添加下面的 NuGet 包:

  • Microsoft.Owin
  • Nowin
  • 向 Program.cs 文件中的 Main 方法添加下面的代码:

    public static void Main(string[] args) {
        var appBuilder = new AppBuilder();
        Nowin.OwinServerFactory.Initialize(appBuilder.Properties);
        var startup = new Owin02_WebApi.Startup();
        startup.Configuration(appBuilder);
        var builder = new ServerBuilder();
        var ip = "127.0.0.1";
        var port = 8888;
        builder.SetAddress(System.Net.IPAddress.Parse(ip)).SetPort(port)
            .SetOwinApp(appBuilder.Build())
            .SetOwinCapabilities((IDictionary<string, object>)appBuilder.Properties[OwinKeys.ServerCapabilitiesKey]);
        using (var server = builder.Build()) {
            Task.Run(() => server.Start());
            var baseAddress = "https://" + ip + ":" + port + "/";
            Console.WriteLine("Nowin server listening " + baseAddress);
            var client = new HttpClient {
                BaseAddress = new Uri(baseAddress, UriKind.Absolute)
            var requestTask = client.GetAsync("api/values");
            requestTask.Wait();
            var response = requestTask.Result; 
            Console.WriteLine(response);
            var readTask = response.Content.ReadAsStringAsync();
            readTask.Wait();
            Console.WriteLine(readTask.Result);
            Console.ReadLine();
    

    如果没错的话就可以看到和 Owin02_WebApi_Katans 一致的效果了, 而且 Nowin 是开源的 纯 .NET 实现, 在 Mono 的环境下也可以运行, 下面是 Mac 系统下的运行截图:

    本博客基于 Tabler CSS 框架, 采用 Jekyll 模板引擎, 使用 Markdown 语法编写。

    博客源代码及文章内容采用 AS-IS 协议发布,转载时请 AS-IS 。