How to write a custom service host in WCF? - wcf

How to write a custom service host in WCF?
I want to have more control on service host.
Please guide me to write my custom service host?

You basically just need to derive from the base ServiceHost class. Anything else is totally up to you.
What do you want to improve upon? Where do you see things you need to do better or different than the standard ServiceHost class?
See these articles and blog post for samples and recipes on how to do it:
Of Hosts and Factories
Extending ServiceHost and the Service Model Layer
Custom ServiceHost Factory for WCF and IIS
Marc

Related

Create WCF Service to be hosted differently

I have a WCF service which programmatically creates its endpoints rather than using a config file - I'm looking into this as our field engineers are prone to break XML easily and we may use different types of binding in different scenarios.
This works well in self-hosted environments (console app, windows app) and as a Windows Service.
Can I do this with a service in IIS or do I have to provide a .SVC file for each endpoint ?
Also will the endpoint address from the client end have to include the .SVC extension ?
This is not a service intended to be used by third parties, only by our client components. We may expose parts of our API later but not initially.
If you're using .NET Framework 4.0 (and later), you can use the ASP.NET routing integration to define a service using a custom ServiceHostFactory implementation. A few things you'll need:
In web.config, set the attribute aspNetCompatibilityEnabled on the <system.serviceModel / serviceHostingEnvironment> element to true
Add a global.asax / global.asax.cs file, and in the Application_Start add a new ServiceRoute to the ASP.NET RouteTable.Routes collection. The service route requres you to define a new service host factory, where you can define your endpoints programmatically.
With that you'll be able to have endpoints without the ".svc" in their addresses. You can also use the service host factory without using routes, by creating a .svc file for each service (not endpoint), and using the Factory attribute in the <%# ServiceHost directive.
For more information about service host factories, check the post at http://blogs.msdn.com/b/carlosfigueira/archive/2011/06/14/wcf-extensibility-servicehostfactory.aspx.

What is the entry method for WCF service hosted on IIS?

A little background info -
I'm trying to host a RESTful WCF service on Azure. As I understand, unless I have the ASP.NET type hosting on the role, I don't really need the global.asax class (which has the application_start method).
From basic prototyping, all I needed was the svc file and the implementation behind it and it automatically gets initialized on role startup (I mean, hosted up on IIS).This is great because I need no extra code other than web.config and my service is up and running. I don't need to create a new service host and start listening on it, etc. I'm able to deploy the role and POST messages to my service.
The problem -
I have custom logging and initialization classes implemented that I need to initialize when my service starts up. I configured my service to be a singleton and I'm not sure where I should put my custom initialization components.
Without an explicit application start method and my service configured as a singleton, can I assume that when the first request comes in, my service constructor gets called? (along with all my custom initialization?).
can I assume that when the first request comes in, my service constructor gets called?
Yes, but you should ask yourself whether you really want your service to run as a singleton. If you're happy with this then it will work fine; if you don't want it to run as a singleton then you should look into Russell's answer using a custom factory.
Look at Should WCF service typically be singleton or not? for some discussion about whether WCF services should be singletons. You need to decide for your situation, but generally WCF services are not singletons unless they need to be.
To implement a custom factory, see this MSDN link Extending Hosting Using ServiceHostFactory. As the link describes, extend the service host factory like so
public class DerivedFactory : ServiceHostFactory
{
public override ServiceHost CreateServiceHost( Type t, Uri[] baseAddresses )
{
return new ServiceHost(t, baseAddresses )
}
}
And then specify your factory in the ServiceHost directive
<% # ServiceHost
Service="MyNamespace.MyService"
Factory="MyNamespace.DerivedFactory" %>
You're looking for ServiceHostFactory. You can add a part to the SVC file to use a factory, where you can do any logging etc. you may need.
I have used this in the past to start a background worker to launch a separate thread for some background work.
http://msdn.microsoft.com/en-us/library/system.servicemodel.activation.servicehostfactory.aspx
Hope this helps you get where you need to be. :)

How to discover WCF service if you do not know the Interface type of the target service?

Can anyone please explain me how to discover a WCF service if you do not know the type of the service Interface.
I am very new to WCF services and I need to write an application to discover some WCF services hosted in the subnet.
I found that you need to specify the service interface in inorder to create a FindCriteria object.
FindCriteria criteria new FindCriteria(typeof(IService1)
Please explain me how this works generally.
This is not how discovery works. WCF discovery is based on WS-Discovery protocol. The protocol is for discovering service with known contract = discovery finds address of the service with known contract. If you don't know the contract you can't use WCF discovery. This is explained in WCF Discovery overview.
If you don't know the contract you don't know what service you are looking for so how would you like to automatically discover it and how would you like to use it?
You can create an empty findcriteria: new FindCriteria().
This will find all discoverable service endpoints.
If you just want to take a look at the service operations, you can use the wcf test client application usually located in "C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\"
All you'll need is the address to the service and you'll be able to try its operations
You can define scopes in the service behavior to "classify" your service and define the scope and scopematch on the findcriteria for partial or full or none match...

DI with WCF -- Where do I initialize the Windsor Container when using WAS hosting?

I was reading an exellent article about how to use dependency injection with WCF Services.
Unfortunately, it only shows how to instantiate and register the Windsor Container in a global.asax file. I'm looking to use WAS for my hosting so global.asax will not get called. Does anyone know where I should register the container? Do I have to extend the WindsorServiceHostFactory an do it in there?
I'm not 100% up to date with development of WCF Facility so it may be already there, but if it's not take a look at this post and the comments.

What is meant by hosting a wcf service?

I want to know what happens when I create an instance of a ServiceHost class?
What it does ?
The ServiceHost (whether instantiated by yourself directly, or whether you delegate that job to IIS/WAS) is the runtime environment for your WCF class - which is just a simple .NET class after all (which needs to run somewhere).
The ServiceHost basically provides all the "plumbing" around your WCF service - creating the endpoints and the listeners on those endpoints to listen for messages and catch those as they come in; it provides the whole channel stack from the transport level through all the layers of WCF up through deserializers on to the dispatcher which then decides which class and which method on that class to call, and so on.
In WCF, in your service class, you write only the actual busienss logic of your service - the ServiceHost and all its classes around it handle all the nitty-gritty details of the receiving of messages and sending back of responses etc.
Marc
Typically the ServiceHost class is used to host your WCF services in a standalone app (such as a console app), if you are not using IIS or Windows Activation Service (WAS).
In simple terms it will deal with the COMs (listening for messages for a particular service).
You can also derive from ServiceHost to add customization if required, in combination with a specialization of ServiceHostFactory.
See MSDN example.
HTH
Phil'
It creates channels that are responsible for things like reliable transfer and security. It listens for incoming messages and calls your operation methods.