Przepraszam z góry za udzielenie odpowiedzi na własne pytanie, ale widzę tak wiele odpowiedzi twierdząc, że AddressFilterMode.Any należy dodać jako atrybut kodu, gdy można utworzyć zachowanie rozszerzenia dla WCF, że robi to samo. Z tym samym pytaniem zadawanym w tak wielu miejscach pomyślałem, że bardziej korzystne byłoby udzielenie odpowiedzi na to pytanie w jednym miejscu.WCF: Jak określić AddressFilterMode.Any deklaratywnie
6
A
Odpowiedz
4
Tworzenie niestandardowego zachowania
Imports System.ServiceModel
Imports System.ServiceModel.Web
Imports System.ServiceModel.Description
Imports System.ServiceModel.Dispatcher
Imports System.ServiceModel.Channels
'We're assuming your project declares some default namespace like Org.ServiceModel
Namespace Description
Public Class AddressFilterModeAnyBehavior
Implements IEndpointBehavior
Private Const jsPostfix As String = "js"
Private Const jsdebugPostFix As String = "jsdebug"
Private Const MaxMetadataEndpointBufferSize As Integer = 2048
Public Sub AddBindingParameters(ByVal endpoint As System.ServiceModel.Description.ServiceEndpoint, ByVal bindingParameters As System.ServiceModel.Channels.BindingParameterCollection) Implements System.ServiceModel.Description.IEndpointBehavior.AddBindingParameters
End Sub
Public Sub ApplyClientBehavior(ByVal endpoint As System.ServiceModel.Description.ServiceEndpoint, ByVal clientRuntime As System.ServiceModel.Dispatcher.ClientRuntime) Implements System.ServiceModel.Description.IEndpointBehavior.ApplyClientBehavior
End Sub
Public Sub ApplyDispatchBehavior(ByVal endpoint As System.ServiceModel.Description.ServiceEndpoint, ByVal endpointDispatcher As System.ServiceModel.Dispatcher.EndpointDispatcher) Implements System.ServiceModel.Description.IEndpointBehavior.ApplyDispatchBehavior
If endpointDispatcher Is Nothing Then Return
endpointDispatcher.AddressFilter = New MatchAllMessageFilter
If (HasWebScriptBehavior(endpoint)) Then
HandleWebScriptBehavior(endpoint, endpointDispatcher)
End If
End Sub
Public Sub Validate(ByVal endpoint As System.ServiceModel.Description.ServiceEndpoint) Implements System.ServiceModel.Description.IEndpointBehavior.Validate
End Sub
Protected Sub HandleWebScriptBehavior(ByVal endpoint As ServiceEndpoint, ByVal endpointDispatcher As EndpointDispatcher)
If endpoint Is Nothing OrElse endpointDispatcher Is Nothing Then Exit Sub
If Not HasListenUri(endpoint) Then Exit Sub
Dim baseAddress As Uri = endpoint.Address.Uri
Dim jsUri As Uri = CreateWebScriptUri(baseAddress, False)
Dim jsdebugUri As Uri = CreateWebScriptUri(baseAddress, True)
Dim host As ServiceHostBase = endpointDispatcher.ChannelDispatcher.Host
Dim channelDispatchers As ChannelDispatcherCollection = host.ChannelDispatchers
For Each channelDispatcher As ChannelDispatcher In channelDispatchers
For Each dispatcher As EndpointDispatcher In channelDispatcher.Endpoints
With dispatcher
Dim endpointUri As Uri = .EndpointAddress.Uri
If (endpointUri.Equals(jsdebugUri) OrElse endpointUri.Equals(jsUri)) Then
.AddressFilter = New MatchAllMessageFilter
End If
End With
Next
Next
End Sub
<System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic")>
Protected Function HasWebScriptBehavior(ByVal endpoint As ServiceEndpoint) As Boolean
If endpoint Is Nothing Then Return False
Return (From behavior In endpoint.Behaviors Where TypeOf behavior Is WebScriptEnablingBehavior).Any
End Function
<System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic")>
Protected Function HasListenUri(ByVal endpoint As ServiceEndpoint) As Boolean
If endpoint Is Nothing Then Return False
Return Not endpoint.Address.Uri.Equals(endpoint.ListenUri)
End Function
<System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic")>
Protected Function CreateWebScriptUri(ByVal baseUri As Uri, ByVal debug As Boolean) As Uri
Dim builder As New UriBuilder(baseUri)
If (debug) Then
builder.Path += If(builder.Path.EndsWith("/", StringComparison.OrdinalIgnoreCase), (jsdebugPostFix), ("/" + jsdebugPostFix))
Else
builder.Path += If(builder.Path.EndsWith("/", StringComparison.OrdinalIgnoreCase), (jsPostfix), ("/" + jsPostfix))
End If
Return builder.Uri
End Function
End Class
End Namespace
utworzenia elementu konfiguracji niestandardowej
Imports System.ServiceModel
Imports System.ServiceModel.Configuration
Imports Hsb.ServiceModel.Description
'We're assuming your project declares some default namespace like Org.ServiceModel
Namespace Configuration
Public Class AddressFilterModeAnyElement
Inherits BehaviorExtensionElement
#Region "BehaviorExtensionElement Implementation"
'The BehaviorExtensionElement base class allows the behavior to be added through configuration
'using the system.servicemodel/extensions .config element.
<System.Diagnostics.CodeAnalysis.SuppressMessage("Configuration", "Configuration102:ConfigurationPropertyAttributeRule", MessageId:="System.ServiceModel.Configuration.WebScriptEnablingElement.BehaviorType", Justification:="Not a configurable property; a property that had to be overridden from abstract parent class")> _
Public Overrides ReadOnly Property BehaviorType() As System.Type
Get
Return GetType(AddressFilterModeAnyBehavior)
End Get
End Property
Protected Overrides Function CreateBehavior() As Object
Return New AddressFilterModeAnyBehavior()
End Function
#End Region
End Class
End Namespace
Używaj element przedłużający w danej konfiguracji WCF Będziemy zakładać, że został nazwany Org.ServiceModel
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="JSON">
<enableWebScript />
<addressFilterModeAny />
</behavior>
</endpointBehaviors>
</behaviors>
<extensions>
<behaviorExtensions>
<!-- Microsoft Connect Issue ID 216431: The full assembly qualified typename including version, culture and key must be specified.-->
<!-- The following endpoint behavior extension element sets the endpoint's address filter mode to any. This allows the service
to operate behind an SSL load balancer where externally https is used and internally http is used.-->
<add name="addressFilterModeAny" type="Org.ServiceModel.Configuration.AddressFilterModeAnyElement, Org.ServiceModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</behaviorExtensions>
</extensions>
</system.serviceModel>
Powiązane problemy
- 1. Jak określić niestandardowe SoapAction dla WCF
- 2. Jak określić typ WCF znany w konfiguracji, który jest ogólny?
- 3. WCF Jak włączyć metadane?
- 4. Jak wybrać wiązanie WCF?
- 5. Jak określić orientację absolutną?
- 6. Jak określić „charakter
- 7. Jak określić OS
- 8. Jak określić typy krotek?
- 9. Jak określić metodę prywatną
- 10. Jak określić architekturę rozproszoną?
- 11. WCF Chunking/Streaming
- 12. WCF: Jak prześledzić treść wiadomości?
- 13. Jak obsługiwać rozłączanie klienta WCF
- 14. Jak logować treść wiadomości WCF?
- 15. Jak utworzyć strony testowe WCF?
- 16. Jak dostosować serializację XML WCF
- 17. Jak określić kod błędu HTTP?
- 18. Jak określić autora pakietu R?
- 19. Jak określić długość niepodpisanego znaku *?
- 20. JSDoc - jak określić długość tablicy
- 21. Jak mogę określić mapę hybrydową?
- 22. Jak określić moją wersję ghc?
- 23. Jak określić ścieżkę do Cargo.toml
- 24. Jak określić nagłówek Accept-Encoding?
- 25. vim: jak określić klawisze strzałek
- 26. Ruby Jak określić środowisko wykonawcze
- 27. Jak określić dostępność instancji MemberInfo?
- 28. Jak określić katalog dla NDK_MODULE_PATH
- 29. Jak określić Windows.Diagnostics.Process od ServiceController
- 30. Jak określić metadane dla dask.dataframe
W moim przypadku miałem nadzieję przejść do konfiguracji i dodać standardowe zachowanie takie, że wsa: Do adresu nie jest zaznaczone lub wymagane jako nagłówek; Ale widzę, że twoje rozwiązanie, podobnie jak wiele innych, wymagało napisania kodu rozszerzenia dokładnie tak samo, który ma wiele wierszy; więc po co zawracać sobie głowę, łatwiej jest po prostu dodać atrybut nad usługą? – joedotnot