寄宿Web API 不一定需要IIS 的支持,我们可以采用Self Host 的方式使用任意类型的应用程序(控制台、Windows Forms 应用、WPF 应用甚至是Windows Service)作为宿主。
方法:
Nuget上安装Microsoft.AspNet.WebApi.SelfHost库
或者 OWIN来承载WebAPI服务
或者 引用:
System.Net.Http.dll
C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET Web Stack 5\Packages:
packages\Microsoft.AspNet.WebApi.Core.5.2.3\lib\net45\System.Web.Http.dll
packages\Microsoft.AspNet.WebApi.SelfHost.5.2.3\lib\net45\System.Web.Http.SelfHost.dll
packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll
Newtonsoft.Json
例如控制台:
public class ValuesController : ApiController
{ public IEnumerable<string> Get() { return new string[] { "111", "222" }; } }class Program
{ static void Main(string[] args) {//Assembly.Load("WebApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"); //加载外部程序集
var config = new HttpSelfHostConfiguration("http://localhost:8080"); config.Routes.MapHttpRoute( "API Default", "api/{controller}/{id}", new { id = RouteParameter.Optional }); using (var server = new HttpSelfHostServer(config)) { server.OpenAsync().Wait(); Console.WriteLine("Press Enter to quit."); Console.ReadLine(); } } }winform:
using (var server = new HttpSelfHostServer(config))
{ server.OpenAsync().Wait();//Console.WriteLine("Press Enter to quit.");//Console.ReadLine();Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);Application.Run(new Form1());}
![](https://common.cnblogs.com/images/icon_weibo_24.png)
![](https://common.cnblogs.com/images/wechat.png)
c#学习笔记之Application.DoEvents应用
Visual Studio里的摘要:处理当前在消息队列中的所有 Windows 消息。
交出CPU控制权,让系统可以处理队列中的所有Windows消息
比如在大运算量循环内,加Application.DoEvents可以防止界面停止响应 因为winform的消息循环是一个线程来处理,那么假如你的某个操作比较耗时,那么消息处理得等你这个耗时操作做完了才能继续,而Application.DoEvents方法就是允许你在耗时操作的内部调用它,而去处理消息队列中的消息。 像鼠标移动鼠标点击都是windows消息,如果耗时操作一直进行,那么界面就像死锁一样。
记得第一次使用Application.DoEvents()是为了在加载大量数据时能够有一个数据加载的提示,不至于系统出现假死的现象,当时也没有深入的去研究他的原理是怎样的,结果在很多地方都用上了Application.DoEvents(),今天看到了关于这方面的一些文章,知道我以前有些用法是不当的,有些地方需要慎用
Application.DoEvents()。
首先我们先看看在循环比较大的程序中,它的作用还是不错的,起到了一个实时响应的效果,例如:
如果没有加上 DoEvents的话,由于循环时间会比较久就会出现假死的状态,而且程序不能处理其他的事件。而如果加上DoEvents的话就会对文本框的值实时响应,给用户带来较好的用户体验,可是DoEvents也带来了效率上的问题,处理同样的一个事件调用了DoEvents后效率降低了好几倍,这也是为什么要慎用的原因了。下面是我做的一个测试:
![](https://images.cnblogs.com/cnblogs_com/datong/time2.jpg)
不用IIS也能執行ASP.NET Web API
转载:
在某些情境,桌面環境執行的程式(Console、Windows Form、WPF… 等)也需要提供API管道供外界呼叫,例如: 先前提到的服務、ERP UI接受外部(如Excel VBA)匯入資料... 等等。
設計API管道時有不少選擇: DDE、Anonymous Pipe/Named Pipe、Socket... 都可行。對轉行寫桌面程式的ASP.NET開發者來說,還有一個溫馨的好選擇 -- 在桌面程式專案裡寫ASP.NET Web API吧!!
是的,即使沒有IIS,ASP.NET Web API也能照跑不誤,在Windows Form、WPF可以繼續用同一招打天下,對跨界寫桌面程式的ASP.NET開發人員,實在是一大福音。
以下使用Console Application專案做個簡單示範。建好新專案後,透過NuGet Packages Manager尋找self host,可以找到"Microsoft ASP.NET Web API Self Host"套件,二話不說立刻安裝。
![](http://www.darkthread.net/Photos/1830-3b21-o.gif)
ASP.NET Web API Self Host由多個組件構成,但不用擔心,NuGet會自動一一下載安裝好。
![](http://www.darkthread.net/Photos/1829-6267-o.gif)
安裝完成後,我們要在主程式中加幾行程式,啟動一個小小的Http Server。
第一步要先透過HttpSelfHostConfiguratio宣告提供Web API的URL。由於向Windows註冊特定的TCP Port需要權限,有兩種做法: 以管理者身分執行Visual Studio及應用程式,或是透過netsh http add urlacl url=http://+:port_number/ user=machine\username指令授權。依"永遠只授與足以執行的最小權限"的資安原則,用netsh授權雖然手續較麻煩,但比讓整個應用程式都具有管理者權限安全。
接 著,使用Routes.MapHttpRoute()指定MVC必備的路由設定,就可使用這組設定值宣告一個HttpSelfHostServer並啟 動。由於會動用到網路資源,建議使用using HttpSelfHostServer的寫法,確保結束時會透過Dispose()釋放相關資源。
加上一段迴圈,直到使用者輸入exit才結束HttpSelfHostServer。在這段期間,HttpSelfHostServer便能接收HTTP請求,找到適當的Controller提供服務。
static void Main(string[] args) { //指定聆聽的URL var config = new HttpSelfHostConfiguration("http://localhost:8011"); //注意: 在Vista, Win7/8,預設需以管理者權限執行才能繫結到指定URL,否則要透過以下指令授權 //開放授權 netsh http add urlacl url=http://+:32767/ user=machine\username //移除權限 netsh http delete urlacl url=http://+:32767/ //設定路由 config.Routes.MapHttpRoute("API", "{controller}/{action}/{id}", new { id = RouteParameter.Optional }); //設定Self-Host Server,由於會使用到網路資源,用using確保會Dispose()加以釋放 using (var httpServer = new HttpSelfHostServer(config)) { //OpenAsync()屬非同步呼叫,加上Wait()則等待開啟完成才往下執行 httpServer.OpenAsync().Wait(); Console.WriteLine("Web API host started..."); //輸入exit按Enter結束httpServer string line = null; do { line = Console.ReadLine(); } while (line != "exit"); //結束連線 httpServer.CloseAsync().Wait(); } }
Console Application專案沒有Models、Controllers、Views資料夾,要如何加入Web API Controller讓人有些茫然,此時讓我們回歸ASP.NET MVC的"Convension over Configuration"(以慣例取代設定)原則: 在專案中新增一個名為BlahController的類別並繼承ApiController,Self Host自然會依著類別名稱認出它,並在有人呼叫http:// localhost:32767/Blah時派它上場。
為了測試,我宣告了一個很沒營養的Date方法傳回日期字串,標註[HttpGet]是為方便用瀏覽器輸入URL就能直接看結果(否則預設只接受POST,需要寫JavaScript才能測試)。
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Web.Http;namespace SelfHostWebApi{ public class BlahController : ApiController { [HttpGet] public string Date() { return DateTime.Today.ToString("yyyy/MM/dd"); } }}
實際執行結果如下:
![](http://www.darkthread.net/Photos/1831-1fa4-o.gif)
不會寫Socket、不懂Named Pipe,居然也能寫出具有API整合功能的桌面程式~ 衝著這點,讓我們一起呼喊: ASP.NET Web API 好威呀!