Self-Host c#學習筆記之Application.DoEvents應用 不用IIS也能執行ASP.NET Web API

Self-Host

 

寄宿Web API 不必定須要IIS 的支持,咱們能夠採用Self Host 的方式使用任意類型的應用程序(控制檯、Windows Forms 應用、WPF 應用甚至是Windows Service)做爲宿主。html

方法:web

Nuget上安裝Microsoft.AspNet.WebApi.SelfHost庫編程

或者 OWIN來承載WebAPI服務c#

或者 引用:windows

System.Net.Http.dllapi

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());
}

 

 
 
 
好文要頂 關注成功  收藏該文   
 
 
 
 
 

c#學習筆記之Application.DoEvents應用

Visual Studio裏的摘要:處理當前在消息隊列中的全部 Windows 消息。

交出CPU控制權,讓系統能夠處理隊列中的全部Windows消息 
好比在大運算量循環內,加Application.DoEvents能夠防止界面中止響應


由於winform的消息循環是一個線程來處理,那麼假如你的某個操做比較耗時,那麼消息處理得等你這個耗時操做作完了才能繼續,而Application.DoEvents方法就是容許你在耗時操做的內部調用它,而去處理消息隊列中的消息。 

像鼠標移動鼠標點擊都是windows消息,若是耗時操做一直進行,那麼界面就像死鎖同樣。

 

 

記得第一次使用Application.DoEvents()是爲了在加載大量數據時可以有一個數據加載的提示,不至於系統出現假死的現象,當時也沒有深刻的去研究他的原理是怎樣的,結果在不少地方都用上了Application.DoEvents(),今天看到了關於這方面的一些文章,知道我之前有些用法是不當的,有些地方須要慎用

 

 

Application.DoEvents()。
首先咱們先看看在循環比較大的程序中,它的做用仍是不錯的,起到了一個實時響應的效果,例如:

 

 

for (int q = 0; q < 1000000; q++)
  {
 textBox1.Text = q.ToString();
 Application.DoEvents();//實時響應文本框中的值
 }

若是沒有加上 DoEvents的話,因爲循環時間會比較久就會出現假死的狀態,並且程序不能處理其餘的事件。而若是加上DoEvents的話就會對文本框的值實時響應,給用戶帶來較好的用戶體驗,但是DoEvents也帶來了效率上的問題,處理一樣的一個事件調用了DoEvents後效率下降了好幾倍,這也是爲何要慎用的緣由了。下面是我作的一個測試:

 private void button1_Click(object sender, EventArgs e)
  {
 expendTime.start();
 for (int q = 0; q < 100000; q++)
 {
 textBox1.Text = q.ToString();
 Application.DoEvents();
 }
 label2.Text = expendTime.ComputerTime();//計算耗時
 }

 private void button2_Click(object sender, EventArgs e)
 {
 expendTime.start();
 for (int q = 0; q < 100000; q++)
 {
 textBox2.Text = q.ToString();
 }
 label3.Text = expendTime.ComputerTime();//計算耗時
 }


執行耗時對比:
從較大數據的循環中能夠看出效率是很低的,因此若是能不調用DoEvents就儘可能不用。也能夠經過別的方法來處理的,例如多線程異步調用等。

 
 

不用IIS也能執行ASP.NET Web API

轉載:http://blog.darkthread.net/post-2013-06-04-self-host-web-api.aspx

在某些情境,桌面環境執行的程式(Console、Windows Form、WPF… 等)也須要提供API管道供外界呼叫,例如: 先前提到的Word轉PDF服務、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"套件,二話不說馬上安裝。

ASP.NET Web API Self Host由多個組件構成,但不用擔心,NuGet會自動一一下載安裝好。

安裝完成後,我們要在主程式中加幾行程式,啟動一個小小的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");
        }
    }
}
複製代碼

 

實際執行結果以下:

不會寫Socket、不懂Named Pipe,竟然也能寫出具備API整合功能的桌面程式~ 衝著這點,讓我們一塊兒呼喊: ASP.NET Web API 好威呀!

相關文章
相關標籤/搜索