2014-02-19 78 views
7

我試圖將我對webservices所做的所有調用轉移到我剛剛創建用於組織和重用我的代碼的可移植類庫(PCL)。我針對的框架是用於Windows應用商店應用的.NET; .NET Framework 4.5; Silverlight 4和更高版本以及WP7和更高版本。在webservice調用上發送的消息頭在便攜庫(PCL)

在我的Win RT項目上,我一直通過實現System.ServiceModel.Dispatcher命名空間中提供的IClientMessageInspector接口來設置消息標題。但是在我的PCL項目中,接口以及System.ServiceModel.Description.IEndpointBehavior都不可用。

所以我需要找出如何將消息頭/服務頭附加到我的服務調用從PCL項目與這些目標框架。任何人都有我應該嘗試的經驗和/或建議?

更新

只是爲了增加更多的信息,我已經試過現在創建WP8項目,發現這些接口不適用於它的。所以IClientMessageInspector和IEndpointBehavior可能不適用於我的PCL項目,因爲它是針對WP8而錯過了它本身。

+0

您使用什麼技術爲客戶提供服務? – Justin

+0

@Justin認爲它是Windows Server上的.Net 4.5。爲什麼這很重要? –

+0

順便說一句,我有興趣在一個PCL中實現這個目標,它也將針對Xamarin.Android,而不僅僅是Windows平臺。我可以通過抽象邏輯來解決這個問題,就像我在其他平臺上做的那樣,但是一個通用的平臺不可知的解決方案會更好。 –

回答

1

你應該能夠範圍OperationContext你要使用當前客戶端通道:

using(var scope = new OperationContextScope(_client.InnerChannel)){ 
    //More to come 
} 

現在,你有你的客戶端通道創建的操作情況下,你可以添加傳出消息頭:

using(var scope = new OperationContextScope(_client.InnerChannel)){ 
    var header = MessageHeader.CreateHeader("x-client-type", "http://www.myapp.com", "WP8"); 

    OperationContext.Current.OutgoingMessageHeaders.Add(header); 

    //Send message to server 
} 

之後,你應該能夠使用OperationContext.CurrentIncomingMessageHeaders屬性來獲取頭。

這些都是WCF服務的核心部分,所以它應該可用(希望)。

Mono確實支持WCF服務,但您必須檢查它們的實現。 EG:也許他們沒有MessageHeader.Create,您將不得不使用var header = new MessageHeader<string>("x-client-type");var untypedHeader = header.GetUntypedHeader("x-client-type", "http://www.myapp.com");來創建要添加的標頭。