c#實現在win服務中承載webapi並支持遠程訪問

1。c#創建一個win服務工程,做好install

2。nuget服務中實現webapi的包,如下:

<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Microsoft.AspNet.Cors" version="5.2.7" targetFramework="net45" />
<package id="Microsoft.AspNet.Mvc" version="5.2.7" targetFramework="net45" />
<package id="Microsoft.AspNet.Razor" version="3.2.7" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Client" version="5.2.7" targetFramework="net452" />
<package id="Microsoft.AspNet.WebApi.Core" version="5.2.7" targetFramework="net452" />
<package id="Microsoft.AspNet.WebApi.Cors" version="5.2.7" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Owin" version="5.2.7" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.7" targetFramework="net452" />
<package id="Microsoft.AspNet.WebPages" version="3.2.7" targetFramework="net45" />
<package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.0" targetFramework="net452" />
<package id="Microsoft.Net.Compilers" version="1.0.0" targetFramework="net452" developmentDependency="true" />
<package id="Microsoft.Owin" version="4.1.0" targetFramework="net45" />
<package id="Microsoft.Owin.Cors" version="4.1.0" targetFramework="net45" />
<package id="Microsoft.Owin.Host.HttpListener" version="4.1.0" targetFramework="net45" />
<package id="Microsoft.Owin.Host.SystemWeb" version="4.1.0" targetFramework="net45" />
<package id="Microsoft.Owin.Hosting" version="4.1.0" targetFramework="net45" />
<package id="Microsoft.Owin.Security" version="4.1.0" targetFramework="net45" />
<package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net45" />
<package id="Newtonsoft.Json" version="12.0.3" targetFramework="net45" />
<package id="Owin" version="1.0" targetFramework="net45" />
</packages>

複製到package.config文件,然後在工程的引用右鍵菜單“將package.config遷移到PackageRe...",然後重新加載工程。關鍵的包就是Owin

3。在OnStart裏啓動一個線程,用來打開WebHttp服務器:

        public void DoStart(string[] args)
        {

            //啓動方案
            _isrun = true;
            _thr = new Thread(new ThreadStart(DoRPC));
            _thr.Start();
        }
        public void DoRPC()
        {
            try
            {

                StartOptions options = new StartOptions();
                options.Urls.Add("http://localhost:17818");
                options.Urls.Add("http://127.0.0.1:17818");
                options.Urls.Add("http://192.168.1.102:17818");   //想遠程訪問,就要加這句,但這句會因爲權限不夠而異常,所以下面要配置服務的運行權限

                using (WebApp.Start<StartupAppBuilder>(options))
                {
                    File.AppendAllText(@"d:\run.log", "啓動WepApi 服務器成功 \r\n");
                    while (_isrun)
                    {
                        Thread.Sleep(2000);
                    }
                }
            }
            catch (Exception ex)
            {
                string msg = ex.Message;
                if (ex.InnerException != null) msg = msg + "\r\n" + ex.InnerException.Message;
                //Console.WriteLine("啓動WepApi 服務器異常:" + msg);
                //Console.ReadLine();
                File.AppendAllText(@"d:\run.log", msg + "\r\n");
            }
        }

4。生成服務程序後後,在服務管理器中,雙擊服務,配置“登錄”-》”此帳戶“-》“某個管權用戶”+密碼。不過後來我發現,在服務工程的安裝文件ProjectInstaller.cs,把Account屬性設爲LocalSystem也一樣,可能是犧牲系統安全性吧。

5。重啓服務,在瀏覽器中http://192.168.1.102:17818/api/values就行了

 

 

另外:
webapi總結:
-遠程無法訪問:
  webapi在vs中“發佈”到某個Website目錄
  在IIS中設置這個Website目錄爲支持.NET4.0,併發布爲網站
  需要在控制面板中“啓用或者關閉WIN功能”中安裝IIS->萬維網服務->應用程序開發->全勾上

服務中的webapi總結:
-遠程無法訪問
  WebApp.Start(option)之前,要:
                options.Urls.Add("http://localhost:17818");
                options.Urls.Add("http://127.0.0.1:17818");
                options.Urls.Add("http://192.168.1.102:17818");
  要給服務工程加上app.manifest文件,加上以後可以以管理員權限運行服務
  給服務屬性加上本地用戶的權限,比如:wg/wg_pwd
  * 和服務、IIS、相關的大多數問題,都是權限不夠,或者WIN的IIS沒裝(組件啓用關閉)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章