[WEB API] Owin self-host

Web Api-Owin self-host

 

前言

 

最近因為工作有碰到需要在各自的電腦安裝Web Api,本機的Web Api串接第三方的Api,但這個Api又會鎖定各台電腦,所以就需要在各台電腦安裝串接第三方Api的介接,因為不想安裝iis,所以就用主控台來做,然後統一連一台主機,然後在各台電腦連各自的Owin啟動的Web Api。

 

關於Owin

 

Owin定義了一個標準的介面介於web server和web應用,Owin的目標是解耦伺服器和應用的聯繫,白話一點就是說不需要像傳統一樣,一定需要Web Api或網站,可以建立一個主控台程式就能跑web api讓網頁調用,當然也可以建立windows服務。

 

安裝必要元件

 

我在此會建立一個主控台的程式,接著就安裝下面這個元件吧


Install-Package Microsoft.AspNet.WebApi.OwinSelfHost -Pre

 

Owin必要就是會從Startup.cs開始執行,所以我這邊的例子就是要用postman來call web api,傳統新增一個Web api專案會從Global開始整個生命週期,但目前因為採用Owin,所以我需要手動新增一個Startup.cs檔,程式碼如下


using Owin;
using System.Web.Http;

namespace ConsoleApplication1
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            var webApiConfiguration = ConfigureWebApi();

            // Use the extension method provided by the WebApi.Owin library:
            app.UseWebApi(webApiConfiguration);
        }

        private HttpConfiguration ConfigureWebApi()
        {
            var config = new HttpConfiguration();
            config.Routes.MapHttpRoute(
                "DefaultApi",
                "api/{controller}/{id}",
                new { id = RouteParameter.Optional });
            return config;
        }
    }
}

 

新增Models資料夾,新增一個類別


namespace ConsoleApplication1.Models
{
    public class Company
    {
         public int Id { get; set; }
         public string Name { get; set; }
    }
}

 

新增Controllers,新增下面類別,模擬Web Api的新刪修行為


using ConsoleApplication1.Models;
using System.Collections.Generic;
using System.Web.Http;
using System.Linq;

namespace ConsoleApplication1.Controllers
{
    public class CompanyController : ApiController
    {
        private static List<Company> company = new List<Company>
            {
                new Company { Id = 1, Name = "Microsoft" },
                new Company { Id = 2, Name = "Google" },
                new Company { Id = 3, Name = "Apple" },
            };

        public IEnumerable<Company> Get()
        {
            return company;
        }

        public IHttpActionResult Get(int Id)
        {
            var result=company.FirstOrDefault(x=>x.Id==Id);
            if(result!=null)
            {
                return Ok(result.Name);
            }
            return NotFound();
        }

        public IHttpActionResult Post(Company InputCompany)
        {
            if (company == null) return BadRequest("沒有輸入任何值");
            if (company.Any(x => x.Id == InputCompany.Id))
            {
                return BadRequest("不可傳入重複Id");
            }
            company.Add(InputCompany);
            return Ok(company);
        }

        public IHttpActionResult Put(Company InputCompany)
        {
            if (company == null) return BadRequest("沒有輸入任何值");
            var existing = company.FirstOrDefault(x => x.Id == InputCompany.Id);
            if (existing == null)
            {
                return NotFound();
            }
            existing.Name = InputCompany.Name;
            return Ok(company);
        }

        public IHttpActionResult Delete(int Id)
        {
            var existing = company.FirstOrDefault(c => c.Id == Id);
            if (company == null)
            {
                return NotFound();
            }
            company.Remove(existing);
            return Ok(company);
        }
    }
}

 

打開Program.cs,然後輸入下面的程式碼


using Microsoft.Owin.Hosting;
using System;

namespace ConsoleApplication1
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            Console.WriteLine("開始Web服務");
            using (WebApp.Start<Startup>("http://localhost:8080"))
            {
                Console.WriteLine("已可執行Web Api");
                Console.ReadLine();
            }
        }
    }
}

 

然後就可以執行F5開啟主控台程式會見到下圖

 

image

 

開啟PostMan然後試著呼叫Web Api可以看到都順利執行。

 

image

image

 

總結

 

很簡單的就可以不使用iis,然後跑一個讓網頁可以呼叫的Web Api,要怎麼實作成什麼樣的專案類型就看個人的決擇,以上再請各位多多指教囉。