2012-12-18 20 views
3

我試圖用上傳通過Silverlight客戶端文件以下MessageContractSilverlight不喜歡我的WCF MessageContract。爲什麼?

[MessageContract] 
public class CategoryClientFileTransferMC : IDisposable 
{ 
    /// <summary> 
    /// CategoryID - Category identity. 
    /// </summary> 
    [MessageHeader(MustUnderstand = true)] 
    public int CategoryID; 

    /// <summary> 
    /// ID - File identifier. 
    /// </summary> 
    [MessageHeader(MustUnderstand = true)] 
    public string ID; 

    /// <summary> 
    /// Length - File length in bytes. 
    /// </summary> 
    [MessageHeader(MustUnderstand = true)] 
    public long Length; 

    /// <summary> 
    /// FileByteStream - File stream. 
    /// </summary> 
    [MessageBodyMember(Order = 1)] 
    public Stream FileByteStream; 

    /// <summary> 
    /// Dispose the contract. 
    /// </summary> 
    public void Dispose() 
    { 
     if (FileByteStream != null) 
     { 
      FileByteStream.Close(); 
      FileByteStream = null; 
     } 
    } 
} 

我的問題是,在客戶端上生成的操作方法,只需要一個參數;一個名爲FileByteStream的字節數組。在我創建的其他(非Silverlight)客戶端中,也會要求輸入MemberHeader字段。沒有指定這些頭文件,服務器不知道該如何處理文件。我在調用操作時如何設置這些標題?

此外,有沒有更好的方法來從Silverlight客戶端上傳文件?這是一個非常頭痛的問題。

謝謝。

回答

3

WCF客戶端的Silverlight子集不支持[MessageHeader]屬性。您仍然可以設置消息標題,但並不像其他平臺那樣簡單。基本上,你需要使用操作語境頭設置,在下面的例子中進行調用,就像之前:

var client = new SilverlightReference1.MyClient(); 
using (new OperationContextScope(client.InnerChannel)) 
{ 
    string contractNamespace = "http://tempuri.org/"; 
    OperationContext.Current.OutgoingMessageHeaders.Add(
     MessageHeader.CreateHeader("CategoryId", contractNamespace, 1)); 
    OperationContext.Current.OutgoingMessageHeaders.Add(
     MessageHeader.CreateHeader("ID", contractNamespace, "abc123")); 
    OperationContext.Current.OutgoingMessageHeaders.Add(
     MessageHeader.CreateHeader("Length", contractNamespace, 123456L)); 
    client.UploadFile(myFileContents); 
} 

哪裏contractNamespace是消息頭字段(IIRC它們默認XML命名空間與服務合同相同)。你可以使用Fiddler和類似於WCF Test Client的東西來查看那裏使用的是哪個命名空間。

+0

如何在服務端檢索這些標題?他們沒有通過消息合約本身。謝謝。 – Jordan

+0

確保標題的名稱/名稱空間與使用非SL客戶端獲得的名稱/名稱空間相同。檢查的一種方法是使用Fiddler比較由「普通」客戶端發送的消息(其具有[MessageHeader]字段)與SL發送的消息。只要它們匹配,服務器就會收到正確的頭文件。 – carlosfigueira

+0

謝謝。 (還有8個字符) – Jordan