Monorepo/Service.EDMIService/ServiceHost.vb

66 lines
2.2 KiB
VB.net

Imports System.ServiceModel
Imports System.ServiceModel.Channels
Imports System.ServiceModel.Description
Public Class ServiceHost(Of T)
Inherits ServiceHost
Public Sub New(baseAddresses As Uri())
MyBase.New(GetType(T), baseAddresses)
End Sub
Public Sub EnableMetadataExchange(ByVal Optional EnableHttpGet As Boolean = True)
If State = CommunicationState.Opened Then
Throw New InvalidOperationException("Host is already opened")
End If
Dim oMetadataBehavior As ServiceMetadataBehavior = Description.Behaviors.Find(Of ServiceMetadataBehavior)()
If oMetadataBehavior Is Nothing Then
oMetadataBehavior = New ServiceMetadataBehavior()
Description.Behaviors.Add(oMetadataBehavior)
If BaseAddresses.Any(Function(uri) uri.Scheme = "http") Then
oMetadataBehavior.HttpGetEnabled = EnableHttpGet
Else
oMetadataBehavior.HttpGetEnabled = False
End If
End If
AddAllMexEndPoints()
End Sub
Public ReadOnly Property HasMexEndpoint As Boolean
Get
Return Description.Endpoints.Any(Function(endpoint) endpoint.Contract.ContractType = GetType(IMetadataExchange))
End Get
End Property
Public Sub AddAllMexEndPoints()
Debug.Assert(HasMexEndpoint = False)
For Each baseAddress As Uri In BaseAddresses
Dim oBinding As Binding = Nothing
Select Case baseAddress.Scheme
Case "net.tcp"
oBinding = MetadataExchangeBindings.CreateMexTcpBinding()
Exit Select
Case "net.pipe"
oBinding = MetadataExchangeBindings.CreateMexNamedPipeBinding()
Exit Select
Case "http"
oBinding = MetadataExchangeBindings.CreateMexHttpBinding()
Exit Select
Case "https"
oBinding = MetadataExchangeBindings.CreateMexHttpsBinding()
Exit Select
End Select
If oBinding IsNot Nothing Then
AddServiceEndpoint(GetType(IMetadataExchange), oBinding, "mex")
End If
Next
End Sub
End Class