2011-10-20 35 views
3

我有幾個我想使用WCF Web API公開的資源。我已經使用Web主機調查了Web API,但我們的服務都作爲Windows服務在生產環境中運行,所以現在是時候讓我把測試放在一邊,並驗證一切都會按照我們的需要進行。我在這裏看到了示例應用程序:http://webapicontrib.codeplex.com/SourceControl/changeset/view/2d771a4d6f6f#Samples%2fSelfHosted%2fserver%2fProgram.cs,但這不適用於當前版本(預覽5),因爲HttpConfigurableServiceHost類不能從我們的代碼訪問。如何在Windows服務中託管Web API

Web API最吸引人的方面之一是使用MapServiceRoute和新的WebApiConfiguration的簡單啓動。然而,我沒有看到爲服務定義基本URL和端口的方法。顯然,在IIS中託管服務消除了這一點,因爲我們在IIS中配置了這些信息。如何在Windows服務中託管時完成此操作?

回答

2

最新版本只是使用HttpServiceHost。 http://webapicontrib.codeplex.com/SourceControl/changeset/view/ddc499585751#Samples%2fSelfHosted%2fserver%2fProgram.cs

如果你仍然有問題,請在我的twitter上找我。

+0

對不起,從辦公室到Twitter的訪問權限。我如何添加更多服務?我是否需要爲每個主機創建一個新的主機,或者是否有將它們添加到現有主機的方法? – SonOfPirate

+0

@SonOfPirate是的,您需要爲每個ServiceContract創建一個新的HttpServiceHost。事實上,這正是MapServiceRoute在封面下所做的。就我個人而言,我不是很高興你必須這樣做,但它確實顯示HttpServiceHost是相對輕量級的。 –

1

這是使用控制檯應用程序的基本代碼。 Windows服務使用相同的基本方法,除了使用啓動和停止方法來啓動和停止服務並且不需要阻止。

static void Main(string[] args) 
{ 
    var host = new HttpServiceHost(typeof(PeopleService), "http://localhost:8080/people"); 

    host.Open(); 

    foreach (var ep in host.Description.Endpoints) 
    { 
     Console.WriteLine("Using {0} at {1}", ep.Binding.Name, ep.Address); 
    } 

    Console.ReadLine(); 

    host.Close(); 
} 

查看this博客文章。

+0

與上述相同的問題,我如何支持更多的服務? – SonOfPirate

+0

您需要爲每個服務類型創建一個新的HttpServiceHost。 – Maurice

+0

這將是很好,如果我可以標記兩個答案是正確的,但該網站不會允許它。我很感謝你的幫助,你的迴應同樣重要,但是Darrel確實做出了迴應,鏈接中的代碼更加完整,所以我標記了他的。 – SonOfPirate

3

其實很簡單。簡而言之,您需要實例化HttpSelfHostServer和HttpSelfHostConfiguration,然後調用server.OpenAsync()。

public void Start() 
{ 
    _server.OpenAsync(); 
} 

public void Stop() 
{ 
    _server.CloseAsync().Wait(); 
    _server.Dispose(); 
} 

有關如何做到這一點使用Windows服務項目模板和/或Topshelf庫示例,請參見我的博客文章:http://www.piotrwalat.net/hosting-web-api-in-windows-service/

+1

明確地說,這是ASP.NET MVC 4的一個特性,因此可用於更新的和更名的ASP.NET Web API。原文是指WCF Web API(ASP.NET版本的前身)。在該版本中,SelfHost名稱空間不存在。 – SonOfPirate