我尝试设置一些已连接的WCF服务,并将自定义HTTP标头从服务传递到服务。
这是我的客户端调用ServiceX,它调用ServiceY,写入数据库。
最初在某些情况下从Silverlight 5客户端调用它们,在ASP.NET Web应用程序中调用其他情况。
我实现了IClientMessageInspector和IDispatchMessageInspector将标头从服务传递到服务,在DispatchMessageInspector中我将标头写入IExtension(Of OperationContext)的实现(见下文)。
但是,我希望这些数据仅在呼叫期间存在,但在某些情况下它似乎在服务中保持不变,因为我一直看到在不同的呼叫中重复相同的标头数据。
最终,我希望能够将自定义标头传递给WCF服务,仅在该调用存在时保留它,将其发送到标头中的下一个服务,并清除该服务实例。我认为使用PerCall WCF服务设置和OperationContext是正确的方法吗?
这是我对IExtension(Of OperationContext)的实现。 auditTransactionId是我想要在服务中传递的东西。同样,Current()属性是我不断看到现有数据的地方:
Imports System.ServiceModel
Public Class CustomOperationContextExtension
Implements IExtension(Of OperationContext)
Private ReadOnly m_items As IDictionary(Of String, Object)
Private m_auditTransactionId As String
Private Sub New()
m_items = New Dictionary(Of String, Object)()
End Sub
Public ReadOnly Property Items() As IDictionary(Of String, Object)
Get
Return m_items
End Get
End Property
Public Property AuditTransactionId() As String
Get
Return m_auditTransactionId
End Get
Set(value As String)
m_auditTransactionId = value
End Set
End Property
Public Shared ReadOnly Property Current() As CustomOperationContextExtension
Get
If (OperationContext.Current IsNot Nothing) Then
Dim context As CustomOperationContextExtension = OperationContext.Current.Extensions.Find(Of CustomOperationContextExtension)()
If context Is Nothing Then
context = New CustomOperationContextExtension()
OperationContext.Current.Extensions.Add(context)
End If
Return context
End If
Return Nothing
End Get
End Property
Public Sub Attach(owner As OperationContext) Implements IExtension(Of System.ServiceModel.OperationContext).Attach
End Sub
Public Sub Detach(owner As OperationContext) Implements IExtension(Of System.ServiceModel.OperationContext).Detach
End Sub
End Class
修改
当我说数据一直存在时,我的意思是当我在一个新的服务调用中调用Current时,我希望Extensions列表为空(在Current()属性的下面的代码中),但总是有一个现有的CustomOperationContextExtension实例已经存在于之前的调用中。我不确定在哪种情况下会发生这种情况。