2011-04-21 14 views
0

我必須採取一些預定義的WSDL(我不控制這些),並將它們暴露在我們的設備上以回覆各種SOAP/UPnP請求。WCF - 泛化動作字符串

無論如何,我已經完成了所有這些工作,但問題已經解決,因爲我有一項服務可以在任意數量的渠道上申請。我將解釋:

[System.ServiceModel.ServiceContractAttribute(Namespace="urn:some:namespace:1", ConfigurationName="myInterface")] 
public interface myInterface 
{ 
    [System.ServiceModel.OperationContractAttribute(Action="urn:some:namespace:1#GetConfiguration", ReplyAction="*")] 
    [System.ServiceModel.XmlSerializerFormatAttribute()] 
    [return: System.ServiceModel.MessageParameterAttribute(Name="config")] 
    MyConfigurationResponse GetConfiguration(MyConfigurationRequest request); 
} 

基本上,我試圖做的(我知道這句法是完全錯誤的,但我認爲它會傳達出點)是這樣的:

[System.ServiceModel.ServiceContractAttribute(Namespace="urn:some:namespace:{channelNumber}", ConfigurationName="myInterface")] 
public interface myInterface 
{ 
    [System.ServiceModel.OperationContractAttribute(Action="urn:some:namespace:{channelNumber}#GetConfiguration", ReplyAction="*")] 
    [System.ServiceModel.XmlSerializerFormatAttribute()] 
    [return: System.ServiceModel.MessageParameterAttribute(Name="config")] 
    MyConfigurationResponse GetConfiguration(MyConfigurationRequest request, String channelNumber); 
} 

我只需要將我的原始Action消息的一部分作爲參數傳遞給我正在實現的方法。

我認爲我可以實現這一點的唯一方法是指定其他一些方法,我們將其稱爲Dispatcher,並使用Action =「*」,然後使用OperationContext.Current.IncomingMessageHeaders.Action手動解析接收到的操作。這看起來像是一個非常陰暗的做事方式。我確信這裏的主要障礙是我對WCF的經驗不足。

任何幫助你能提供將不勝感激。

感謝,

回答

0

管理最簡單的方法是創建一個通用的消息處理程序。該協議將是這個樣子:

[ServiceContract(SessionMode = SessionMode.Allowed)] 
public interface ICatchAll 
{ 
    [OperationContract(IsOneWay = false, Action = "*", ReplyAction = "*")] 
    Message ProcessMessage(Message message); 
} 

的想法是,你爲你服務along the lines of this article.創建一個「路由器」的方法您仍需要創建單獨的通道服務合同塑造SOAP消息被接收&返回,但您將客戶端端點轉到您的「路由器」服務端點。如果您爲每個渠道服務合同創建單獨的實例,則可以使用新的WCF 4路由服務沿着這些線路做些事情。

+0

感謝您的評論Sixto。正如你很快就會看到的,我仍然從這件事開始。也許我可以重新構建我的問題,以獲得某種不同類型的解決方案。我確實沒有修改SVCUtil.exe生成的接口文件的問題,但我可以通過各種UPnP客戶端接收128個以上的不同頻道,並且手動編寫3或4個服務的所有這些內容將會變得非常困難。 – 2011-04-21 21:36:48

0

操作方法的唯一通用是通配符*,它通常與輸入和輸出一起使用,作爲通用的Message

有一種方法可以自定義操作選擇和參數定義和填充的整個行爲。可以檢查以下接口:

  • IDispatchOperationSelector使用基於進來的數據
  • IOperationInvoker選擇操作用於分配參數和調用由IDispatchOperationSelector
  • IDispatchMessageFormatter選擇的操作被用於填充參數的操作分配插槽準備IOperationInvoker

你可能不需要全部實現它們,但它們可以讓你自定義行爲vior以任何你需要的方式。例如,自定義選擇器和格式化程序檢查MSDN samples,例如自定義調用程序檢查this article。無論如何,這整個基礎結構編碼只會將您的Action分析移到一些WCF內部,但您仍然必須這樣做才能將其作爲操作參數。

+0

這聽起來更像我正在尋找的東西,並認爲它最終會讓我找到解決方案。直到明天我纔有機會試用,但我當時也會更新。 非常感謝您的幫助。 =) – 2011-04-21 21:53:18