2013-09-30 60 views
0

此問題似乎已被多次詢問,但我無法使其正常工作。WCF消息Intersecpter配置問題

首先,我現在在使用VS 2012的Windows 7和Windows 8上都嘗試了這一點,並且具有完全相同的問題。

我正在嘗試編寫一個接收和處理SOAP頭消息的WCF服務,並且在大量搜索後發現我應該使用消息攔截器來讀取和處理SOAP頭。

所以我在我的本地機器上創建了一個新的網站,並將其命名爲DemoMessageInspector。在這個解決方案,我已經添加了以下類:

HmacVerificationBehavior

Imports System.ServiceModel.Description 

Public Class HmacVerificationBehavior 
    Implements IEndpointBehavior 
    #Region "IEndpointBehavior Members" 

Public Sub AddBindingParameters(endpoint As ServiceEndpoint, bindingParameters As System.ServiceModel.Channels.BindingParameterCollection) Implements IEndpointBehavior.AddBindingParameters 

End Sub 

Public Sub ApplyClientBehavior(endpoint As ServiceEndpoint, clientRuntime As System.ServiceModel.Dispatcher.ClientRuntime) Implements IEndpointBehavior.ApplyClientBehavior 

End Sub 

Public Sub ApplyDispatchBehavior(endpoint As ServiceEndpoint, endpointDispatcher As System.ServiceModel.Dispatcher.EndpointDispatcher) Implements IEndpointBehavior.ApplyDispatchBehavior 
    Dim inspector As New HmacVerificationInspector() 

    endpointDispatcher.DispatchRuntime.MessageInspectors.Add(inspector) 
End Sub 

Public Sub Validate(endpoint As ServiceEndpoint) Implements IEndpointBehavior.Validate 

End Sub 

#End Region 

End Class 

HmacVerificationConfigurationSection

Imports System.ServiceModel.Configuration 
Imports System.ServiceModel.Description 

Namespace NamespaceHere 

Public Class HmacVerificationConfigurationSection 
    Inherits BehaviorExtensionElement 
    Implements IServiceBehavior 

#Region "IServiceBehavior Members" 

    Public Sub AddBindingParameters(serviceDescription As ServiceDescription, serviceHostBase As System.ServiceModel.ServiceHostBase, endpoints As System.Collections.ObjectModel.Collection(Of ServiceEndpoint), bindingParameters As System.ServiceModel.Channels.BindingParameterCollection) Implements IServiceBehavior.AddBindingParameters 

    End Sub 

    Public Sub ApplyDispatchBehavior(serviceDescription As ServiceDescription, serviceHostBase As System.ServiceModel.ServiceHostBase) Implements IServiceBehavior.ApplyDispatchBehavior 

    End Sub 

    Public Sub Validate(serviceDescription As ServiceDescription, serviceHostBase As System.ServiceModel.ServiceHostBase) Implements IServiceBehavior.Validate 

    End Sub 

#End Region 

    Public Overrides ReadOnly Property BehaviorType() As Type 
     Get 
      Return GetType(HmacVerificationBehavior) 
     End Get 
    End Property 

    Protected Overrides Function CreateBehavior() As Object 
     Return New HmacVerificationBehavior() 
    End Function 

End Class 

End Namespace 

HmacVerificationInspector

Imports System.ServiceModel.Dispatcher 
Imports System.ServiceModel.Channels 

Public Class HmacVerificationInspector 
Implements IDispatchMessageInspector 


#Region "IDispatchMessageInspector Members" 

Public Function AfterReceiveRequest(ByRef request As System.ServiceModel.Channels.Message, channel As System.ServiceModel.IClientChannel, instanceContext As System.ServiceModel.InstanceContext) As Object 
    Dim buffer As MessageBuffer = request.CreateBufferedCopy(Int32.MaxValue) 
    request = buffer.CreateMessage() 
    Dim dupeRequest As Message = buffer.CreateMessage() 

    ValidateHmac(dupeRequest) 

    buffer.Close() 

    Return Nothing 
End Function 

Public Sub BeforeSendReply(ByRef reply As System.ServiceModel.Channels.Message, correlationState As Object) 


End Sub 

#End Region 

Public Function AfterReceiveRequest1(ByRef request As Message, channel As ServiceModel.IClientChannel, instanceContext As ServiceModel.InstanceContext) As Object Implements IDispatchMessageInspector.AfterReceiveRequest 

End Function 

Public Sub BeforeSendReply1(ByRef reply As Message, correlationState As Object) Implements IDispatchMessageInspector.BeforeSendReply 

End Sub 
End Class 

IService

Imports System.ServiceModel 

' NOTE: You can use the "Rename" command on the context menu to change the interface name "IService" in both code and config file together.' 
<ServiceContract()> 
Public Interface IService 

<OperationContract()> 
Sub DoWork() 

<OperationContract()> 
Function DoSomething(ByVal _str As String) As String 


End Interface 

和服務

Public Class Service 
Implements IService 

Public Sub DoWork() Implements IService.DoWork 
End Sub 

Public Function DoSomething(ByVal _str As String) As String Implements IService.DoSomething 

    Return "Message [" & _str & "]" 

End Function 

End 

在Web.config文件如下:

<configuration> 
<system.web> 
<compilation debug="true" strict="false" explicit="true" targetFramework="4.5"/> 
<httpRuntime targetFramework="4.5"/> 
    </system.web> 
    <system.serviceModel> 
    <extensions> 
    <behaviorExtensions> 
    <add name="hmacVerification" 
     type="NamespaceHere.HmacVerificationConfigurationSection, NamespaceHere, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/> 
    </behaviorExtensions> 
    </extensions> 
    <services> 
    <service name="MySecureService"> 
    <endpoint address="" binding="webHttpBinding" contract="IMySecureService" behaviorConfiguration="web"/> 
    </service> 
</services> 
<behaviors> 
    <endpointBehaviors> 
    <behavior name="web"> 
     <webHttp automaticFormatSelectionEnabled="true"/> 
     <hmacVerification />  *********COMMENT OUT************** 
    </behavior> 
    </endpointBehaviors> 
    <serviceBehaviors> 
    <behavior name=""> 
     <serviceMetadata httpGetEnabled="true"/> 
     <serviceDebug includeExceptionDetailInFaults="false"/> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true"/> 
    </system.serviceModel> 
</configuration> 

所以,我們有例子代碼工程完美如果該行在Web.C中被註釋掉onfig。發生以下情況:

Server Error in '/DemoMessageInspector' Application. 
-------------------------------------------------------------------------------- 


Configuration Error 
    Description: An error occurred during the processing of a configuration file required to service this request. Please review the specific error details below and modify your configuration file appropriately. 

Parser Error Message: The type 'NamespaceHere.HmacVerificationConfigurationSection, NamespaceHere, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' registered for extension 'hmacVerification' could not be loaded. 

Source Error: 



Line 25:   <behavior name="web"> 
Line 26:   <webHttp automaticFormatSelectionEnabled="true"/> 
Line 27:   <hmacVerification /> 
Line 28:   </behavior> 
Line 29:  </endpointBehaviors> 


Source File: C:\inetpub\wwwroot\DemoMessageInspector\web.config Line: 27 


-------------------------------------------------------------------------------- 
Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.18044 

所以,問題基本上應該如何配置?

或者,也許問題是,這是從WCF端點讀取SOAP頭完成一個簡單的任務是正確的方法嗎?

回答