2011-09-28 21 views
0

我在自定義通道上實現了IDuplexSessionChannel,因爲我使用了tcpTransport。在那個自定義通道中,我緩存了服務調用響應(客戶端緩存)。但它有錯誤。在IRequestChannel中,它工作正常。如何在TryMessage方法中更改消息。我的代碼:如何更改WCF自定義通道中的DuplexSessionChannel(tcpTransport)中的消息?

public Message Receive(TimeSpan timeout) 
    { 
     Message response = null; 
     response = CommunicationCacheManager.Get(_request.Headers.Action, _request); 

     if (response == null) 
     { 
      response = this.InnerChannel.Receive(timeout); 
      int cacheTimeout = 0; 
      if (response.Headers.FindHeader(Constants.CacheTimeOutHeader.NAME, Constants.CacheTimeOutHeader.NAMESPACE) > -1) 
      { 
       cacheTimeout = response.Headers.GetHeader<int>(Constants.CacheTimeOutHeader.NAME, Constants.CacheTimeOutHeader.NAMESPACE); 
      } 
      if (cacheTimeout > 0 && response != null && 
        !response.IsFault && 
        !response.IsEmpty) 
      { 
       CommunicationCacheManager.Add(_request.Headers.Action, cacheTimeout, ref response); 
      } 
     } 
     return response; 
    } 

    public Message Receive() 
    { 
     return this.InnerChannel.Receive(); 
    } 

    public bool TryReceive(TimeSpan timeout, out Message message) 
    { 
     ThrowIfDisposedOrNotOpen(); 
     message = null; 
     bool timedout = false; 
     try 
     { 
      message = this.Receive(timeout); 
     } 
     catch (TimeoutException) 
     { 
      timedout = true; 
     } 
     return (!timedout); 
    } 

CacheManager的工作原理。我得到響應緩存。但tryreceive再次運行,當我看消息。消息已關閉。我該如何解決這個問題

回答

0

問題解決了。

Tcp Binding將相關標題添加到消息中。所以代碼更改爲

public Message Receive(TimeSpan timeout) 
{ 
    Message response = null; 
    response = CommunicationCacheManager.Get(_request.Headers.Action, _request); 

    if (response == null) 
    { 
     response = this.InnerChannel.Receive(timeout); 
     int cacheTimeout = 0; 
     if (response.Headers.FindHeader(Constants.CacheTimeOutHeader.NAME, Constants.CacheTimeOutHeader.NAMESPACE) > -1) 
     { 
      cacheTimeout = response.Headers.GetHeader<int>(Constants.CacheTimeOutHeader.NAME, Constants.CacheTimeOutHeader.NAMESPACE); 
     } 
     if (cacheTimeout > 0 && response != null && 
       !response.IsFault && 
       !response.IsEmpty) 
     { 
      CommunicationCacheManager.Add(_request.Headers.Action, cacheTimeout, ref response); 
     } 
    } 
    else 
    { 
     response.Headers.RelatesTo=_request.Header.MessageId; 
    } 
    return response; 
} 
相關問題