2011-08-24 59 views
0

我想創建一個啓動時運行特定方法的web服務。
這是服務的接口:在啓動時自動運行web服務中的方法

namespace MyClass 
{ 
    [ServiceContract] 
    public interface IService 
    { 
     [OperationContract] 
     string getData(); 

    } 
} 

和服務本身,我想具體的方法(而不是那些之一)運行時的服務加載(或部署到IIS)。有沒有辦法呢?

回答

3

您需要清楚在WCF服務託管在IIS中時發生了什麼。

  • IIS提供加載按需
  • ,當請求中
  • 一個服務主機,IIS實例化服務主機,這反過來實例化服務類的一個實例,通過它從請求參數,然後在服務類別上執行適當的方法

因此,沒有時間點「服務負載」然後在內存中徘徊。 「服務」不僅僅是當IIS啓動時加載,然後在任何時候都「現在和準備就緒」...

那麼你想插入什麼?

  • 服務主機載荷IIS?在這種情況下,您必須創建自己的自定義服務主機並將其註冊到IIS,以便IIS使用您的自定義主機而不是WCF默認服務主機

  • 當實際的服務類被實例化以處理請求?然後把你的邏輯到您的服務類的構造函數 - 它會在每個服務類實例來處理請求

+0

如果服務主機在[託管的Windows服務](http://msdn.microsoft.com/zh-cn/library/ms733069.aspx)中運行,該怎麼辦?我如何執行一個自動運行? –

+0

@JohnIsaiahCarmona:正如我所說 - 根本沒有真正的「自動運行」功能。如果您使用「per-call」激活模型,將需要在服務調用處理之前運行的任何代碼放入服務類的構造函數中 - 在服務類實例化之前運行代碼處理請求 –

+0

我發佈[我的問題在這裏](http://stackoverflow.com/questions/9937810/wcf-run-service-constructor-once-with-an-instancecontextmode-of-persession)的進一步細節。請幫忙。 –

0

雖然這可能不是你想要什麼,你可以使用類的構造函數,或者:

public class Service : IService 
{ 
    public Service() 
    { 
     //code here will execute when an instance 
     //of this service class is instantiated 
    } 

    string getData() { ... } 
} 

它會更清楚,如果你能告訴我們你要調用的方法,任何周圍的信息,這樣你就不會得到不好的建議。細節很好。

+0

我想知道什麼是我的地址,當我加載和存儲在某個地方沒有特殊的外部主機。例如「this.getAddress」 – Ben2307

+0

然後這應該就足夠了,只需獲取地址並將其存儲在某處(在實例的整個生命週期中臨時訪問)。你可能想考慮一個更長期的解決方案,但是對於地址我會選擇_here&now_選項,而不是緩存可能會改變的東西。另外,我會將相關信息添加到您的原始問題中,以便其他人可以立即閱讀。 –

0

這裏就是我把一些代碼,以獲得(和緩存)數據按時執行web服務啓動(在VB中)。你需要通過導航到任何有效或無效的觸發服務

Public Module WebApiConfig 
    Public Sub Register(ByVal config As HttpConfiguration) 
     'Run this method on startup to cache the addresses 
     Address.GetAll() 

     config.Routes.MapHttpRoute(
      name:="DefaultApi", 
      routeTemplate:="api/{controller}/{id}", 
      defaults:=New With {.id = RouteParameter.Optional} 
     ) 
    End Sub 
End Module 
相關問題