tech·nic·al·ly agile

Creating WCF Service Host Programmatically

Learn to create a WCF Service Host programmatically with expert tips on base addresses, service behaviors, and secure bindings for robust .NET services.

Published on
2 minute read
Image
https://nkdagility.com/resources/z78UlmtJAzV

If you want to create a Windows Communication Foundation  Service Host on the fly then you will need to first create a base address. I would recommend using the DNS host entry instead of the My.Computer.Name as I had many problems on the corporate network with [computername] not working with our proxy settings.

Dim baseAddresses() As Uri = {New Uri(String.Format("http://{0}:{1}/TFSEventHandler/Queuer", System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName).HostName, Port))}

Then you need to create the service host itself.

Dim sh As New System.ServiceModel.ServiceHost(GetType(Services.QueuerService), baseAddresses)

Then set the service meta and debug behaviors so that you can both enable the MEX and remote exception handling.

' Set service meta behavior
Dim smb As ServiceMetadataBehavior = sh.Description.Behaviors.Find(Of ServiceMetadataBehavior)()
If smb Is Nothing Then
  smb = New ServiceMetadataBehavior()
  smb.HttpGetEnabled = True
  sh.Description.Behaviors.Add(smb)
Else
  smb.HttpGetEnabled = True
End If
' Set Service Debug Behavior
Dim sdb As ServiceDebugBehavior = sh.Description.Behaviors.Find(Of ServiceDebugBehavior)()
If sdb Is Nothing Then
  sdb = New ServiceDebugBehavior()
  sdb.IncludeExceptionDetailInFaults = True
  sh.Description.Behaviors.Add(sdb)
Else
  sdb.IncludeExceptionDetailInFaults = True
End If

Then comes the easy bit, adding the Endpoints. I have chosen to use a Secure wsHttpBinding as I am using Active Directory authentication and I want another level of security. Here I am creating a number of static end points, but also an endpoint for each of the Team Foundation Server SOAP Events, which uses the same code to handle each one, but you can determine the incoming URL for the event type.

sh.Description.Endpoints.Clear()
For Each EventType As Events.EventTypes In [Enum].GetValues(GetType(Events.EventTypes))
    sh.AddServiceEndpoint(GetType(Services.Contracts.INotification), GetSecureWSHttpBinding, "Notification/" & EventType.ToString)
Next
sh.AddServiceEndpoint(GetType(Services.Contracts.ISubscriptions), GetSecureWSDualHttpBinding, "Subscriptions")
sh.AddServiceEndpoint(GetType(Services.Contracts.ITeamServers), GetSecureWSDualHttpBinding, "TeamServers")
sh.AddServiceEndpoint(GetType(Description.IMetadataExchange), GetSecureWSHttpBinding, "mex")

You will need to create the binding programmatically as well (see the GetSecureDualWSHttpBinding method referenced above) and you may need to set some specialist options. I needed to increase the size of some of the payloads to implement my service. I have chosen to use the same method to create the service on both the client and the server so I have included the ClientBaseAddress property to get around the problem on Windows of a “http://+:80 error if you have IIS installed.

Dim Binding As New WSDualHttpBinding(WSDualHttpSecurityMode.Message)
Binding.MaxReceivedMessageSize = 655360
Binding.ReaderQuotas.MaxStringContentLength = 655360
Binding.ReaderQuotas.MaxArrayLength = 655360
Binding.Security.Message.ClientCredentialType = MessageCredentialType.Windows
Binding.Security.Message.NegotiateServiceCredential = True
Binding.ClientBaseAddress = New System.Uri("http://" & System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName).HostName & ":660")
Binding.BypassProxyOnLocal = True

Using this in conjunction with the custom proxy creation will allow you to build versatile integrated services on the .NET platform.

You can find all of the code listed above @ http://www.codeplex.com/TFSEventHandler 

Windows Software Development Install and Configuration Technical Mastery
Comments

Related blog posts

No related videos found.

Connect with Martin Hinshelwood

If you've made it this far, it's worth connecting with our principal consultant and coach, Martin Hinshelwood, for a 30-minute 'ask me anything' call.

Our Happy Clients​

We partner with businesses across diverse industries, including finance, insurance, healthcare, pharmaceuticals, technology, engineering, transportation, hospitality, entertainment, legal, government, and military sectors.​

Microsoft Logo
Lean SA Logo
Lockheed Martin Logo
Bistech Logo
Hubtel Ghana Logo
ALS Life Sciences Logo
Boeing Logo

NIT A/S

Teleplan Logo
Big Data for Humans Logo
Cognizant Microsoft Business Group (MBG) Logo
Slicedbread Logo
Emerson Process Management Logo
MacDonald Humfrey (Automation) Ltd. Logo
YearUp.org Logo

CR2

Higher Education Statistics Agency Logo
Flowmaster (a Mentor Graphics Company) Logo
Washington Department of Transport Logo
Nottingham County Council Logo
Washington Department of Enterprise Services Logo
Ghana Police Service Logo
Royal Air Force Logo
New Hampshire Supreme Court Logo
Cognizant Microsoft Business Group (MBG) Logo
Flowmaster (a Mentor Graphics Company) Logo
Schlumberger Logo
Akaditi Logo
Milliman Logo
Freadom Logo