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開啟主控台程式會見到下圖
開啟PostMan然後試著呼叫Web Api可以看到都順利執行。
總結
很簡單的就可以不使用iis,然後跑一個讓網頁可以呼叫的Web Api,要怎麼實作成什麼樣的專案類型就看個人的決擇,以上再請各位多多指教囉。