Self-Host c#学习笔记之Application.DoEvents应用 不用IIS也能執行ASP.NET Web API

Self-Host c#学习笔记之Application.DoEvents应用 不用IIS也能執行ASP.NET Web APISelf-Host c#学习笔记之Application.DoEvents应用 不用IIS也能執行ASP.NET Web API

大家好,又见面了,我是你们的朋友全栈君。

Self-Host

 

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

 

 
 
 
好文要顶 关注成功 
收藏该文 

Self-Host c#学习笔记之Application.DoEvents应用 不用IIS也能執行ASP.NET Web API 

Self-Host c#学习笔记之Application.DoEvents应用 不用IIS也能執行ASP.NET Web API

 
 
 
 
 

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();//计算耗时
 }

执行耗时对比:Self-Host c#学习笔记之Application.DoEvents应用 不用IIS也能執行ASP.NET Web API
从较大数据的循环中可以看出效率是很低的,所以如果能不调用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”套件,二話不說立刻安裝。

Self-Host c#学习笔记之Application.DoEvents应用 不用IIS也能執行ASP.NET Web API

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

Self-Host c#学习笔记之Application.DoEvents应用 不用IIS也能執行ASP.NET Web API

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

 

實際執行結果如下:

Self-Host c#学习笔记之Application.DoEvents应用 不用IIS也能執行ASP.NET Web API

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/107301.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • SpringBoot 配置 Redis 连接池

    SpringBoot 配置 Redis 连接池SpringBoot2.0默认采用Lettuce客户端来连接Redis服务默认是不使用连接池的,只有配置redis.lettuce.pool下的属性的时候才可以使用到redis连接池

    2022年10月31日
  • 学习Android之SharedPreferences使用

    学习Android之SharedPreferences使用

  • 一个可以恶搞朋友的关机程序!!!

    一个可以恶搞朋友的关机程序!!!文章目录前言一、关机程序1.思路分析二、运行结果如下1.点击后总结前言这是一个可以恶搞朋友的关机程序,实现原理是通过system直接调用dos命令窗口启动关机程序,既然是恶搞那就一定要给你的恶搞对象一定的“机会”,下面我将带大家一起来学习一个这个简单的恶搞程序。(源码可以私信找我要,简单改一下输出语句便可以直接自己使用)大家编译后可以直接把.exe文件发给你所需要恶搞的对象一、关机程序1.思路分析1.使用system调用dos命令窗口直接输入关机命令并弹出提示,此时windows响应跳出关机

  • es6数组的flat()方法

    es6数组的flat()方法Array.prototype.flat()flat()方法会按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回。Array.prototype.flat()用于将嵌套的数组“扁平化”,将二维数组变成一维数组。该方法返回一个新数组,对原数据没有影响。语法:varnewArray=arr.flat([depth])参数:depth可选,指定要提取嵌套数组的结构深度,默认值为1。返回值:一个包含数组与子数组中所有元素的新数组。示例:var

  • 9-ICMP报文种类「建议收藏」

    9-ICMP报文种类「建议收藏」1.ICMP报文种类  ICMP报文的种类分为两种:一种是差错报告报文,另一种是查询报文。  对于差错报告报文来说,ICMP总是把差错报文报告给发送数据源端(源主机)。比如:主机A给主机发送一个数据,结果这个数据在网络传输过程中出错了,然后ICMP协议的机制就会返回一个差错报告给主机A(相当于把数据在传输过程中出错的信息发回给主机A)。2.差错报告报文差错报告报文常见有以下…

  • Nginx中sendfile的作用

    Nginx中sendfile的作用那么sendfile是什么东西,他是怎么影响性能的…… sendfile实际上是Linux2.0+以后的推出的一个系统调用,web服务器可以通过调整自身的配置来决定是否利用sendfile这个系统调用。先来看一下不用sendfile的传统网络传输过程:read(file,tmp_buf,len);write(socket,tmp_buf,len);硬盘&gt;&gt;…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号