Deploying individual or multiple WCF services per IIS application? - wcf

I am in the middle of an internal debate about IIS hosting. For a given enterprise application we have N WCF services.
One option is to host each WCF service in its own IIS application. This implies each service has its own web.config and [possibly] its own Application Pool.
Another option is to hose all WCF services in one IIS application. This implies one web.config for all those services and one Application Pool.
The individual option gives the flexibility to have different configuration (IIS and web.config) for each service. Individual Application Pools would enable more granular control of resetting the processes.
The shared option is more simple and is possible because the IIS and application configuration (web.config) should be the same for each service.
I am looking for advice\best practice between these two options.

Working in the same type of enterprise environment as the one you describe we find the best practise is as follows:
Group similar functions into "Applications" which are then hosted under one WCF service. This gives us e.g. CustomerService, AccountsService etc.
Each service has its own App. Domain to give it process separation and security separation from the other services. That is, each service runs under the context of an ActiveDiretory (AD) account and doing this allows us secure downstream resources such as SQL server databases.
E.g. CustomerService runs under DOMAIN\CustomerServiceUser user. We can then secure for example stored procedures related to customer functions so they can only be executed by the CustomerServiceUser user. We can then use integrated security for our connection to the SQL server. This allows enterprise permissions to be managed at the Active Directory level.
We deploy using scripting for both the IIS configuration and our web.config files. This has the advantage that the IIS configuration can also be kept in source control as can the transform files for our web.config files. We then have full version history or our configuration and additionally can use this to quickly roll out additional machines if we decide to duplicate & load balance the services.
This is what we find to be the best practise although the requirements of your organisation may be different.

Related

Hosting a continuosly running Console application

Azure VM, Cloud service or Web job?
I have a configurable console application which runs continuosly. Currently it is running on a VM and consumes lot of memory (it is basically doing data mining).
The current requirement is to have multiple instances of this application with different set of configuration which can be changed by specific users.
So where should I host this application such that the configuration can be modified using some front end which provides access managements(like Sharepoint),ability to stop it/restart (like WCF service) without logging on the VM?
I am open to any suggestions/ideas. Thanks
I don't think there's any sold answer to this question as there is the preference variable but for what it's worth, if it were up to me I would deploy it against individual azure VM's for each specific set of users. That way if the server resources went up because of config changes the user group made it is isolated to that group, and with azure, will scale automatically to meet the resource demand. Then just build a little .net web app to allow user to authenticate and change configuration settings.
You could expose an "admin" endpoint for your service (obviously you need authentication here!) that:
1. can return the current configuration
2. accept new configuration
3. restart the service (if needed). Stopping the service will be harder, since that leaves the question on how to start it again.
Then you need to write your own (or use a 3-party (like sharepoint or a CMS)) application that will handle your users and under the hood consume your "admin" endpoint.
Edit: The hosting part: If I understand you correctly your app is just an console application today, and you don't know how to host it? Well, there are many answers to that question. If you have a operations department go talk to them, if you are on your own play around and see what fits you and your environment best!
My tip: go for a http/https protocol/interface - just because there are many web host out there, and you can easy find tools for that protocol. if you are on the .NET platform check out Web.API or OWASP
Azure now has Machine learning to process data mining.
You should check if it's suit to you.
Otherwise, you can use Webjob:
Allow you to have multiple instances of your long time running job (Webjon scaling out).
AppSettings can be change from the Azure Portal or using the Azure Management API

Good practice for setting up multiple WCF services in virtual directories under one root url

I am setting up our server to handle all our WCF web services. What I want to know is, what is the best practice for proper isolation of each service under one root domain?
I'm using something like http://api.ourdomain.com and I want each of our client's WCF services to be isolated in separate virtual directories like http://api.ourdomain.com/client1.
I'd like it so that if any one fails/bombs they won't affect other live WCF services running.
Normally I isolate them by website, but since these are all under one 'roof' so to speak, Ihave to do some IIS trickery to properly isolate them.
I had setup a virtual directory and had it as it's own 'app' but I was getting the following error:
"It is not possible to run two different versions of ASP.NET in the same IIS process. Please use the IIS Administration Tool to reconfigure your server to run the application in a separate process."
Which is strange since I had them both set to use .NET 4.0 framework, so, I'm not sure what happened.

Regarding wcf service hosting

i am new in wcf and started learning. i got one confusion like that i create a small wcf service and just do not host it in IIS,console apps or win service but from another apps i can add the service reference of svc file and found it is working. if wcf can work without hosting in any place like "IIS,console apps or win service " then why people would alway host wcf service in IIS,console apps or win service. can anyone tell me the reason.
people use IIS and windows services in general because they are simpler to setup and run more consistently. they can also be hosted more easily on servers where the services can be configured to start automatically, and as usually wcf is used as a server communication method it is usually this that you want to do.
hosting in console applications is generally easier to setup for simple examples for testing purposes, when you want to test your services locally.
Whilst hosting in applications as possible it's a less common scenario to use wcf to communicate between 2 applications on the same machine.
EDIT:
Your original question asked why people always talk about IIS, services etc. The point I was making was that usually wcf is used for web services, and is usually run on a server other than the local machine. Even though it can be used for inter process communication on the same machine this is not the most common use case. This is why you see a lot of examples using IIS and not too many hosting it in a Windows forms app.

Managing Net TCP Port Sharing Configuration through Group Policy

Our organization has an application infrastructure that consists of many WCF services deployed over many different servers on our network. We'd like to move towards using the Net TCP Port Sharing service so that we can remove the need to assign a particular port for a particular service. Enabling the service is easy, but the issue we have is allowing custom service users to access the service.
According to MSDN, services that run under an identity other than the defaults have to be added via the SMSvcHost.exe.config file in the .NET framework directory. We're not entirely comfortable with the idea of having to individually modify this config file for every machine we want to enable port sharing on, is there a way that access and configuration for this service could be controlled through Group Policy or some other centralized means?

How to develop a WCF Service to automatically manage other related WCF services hosted as Window Service?

Kindly help me in architecting a solution which is required for my ongoing project.
I have developed some WCF Services hosted as windows services which I did and working fine so far. Now I am asked to develop a master WCF type of service which should be intelligent enough to manage all other WCF service for possible corruption/errors and can repair them and restart.
Thanks in advance.
As we have written a custom host and took us years to make it a real application server, I will share some of the challenges that we had. Creating a custom host that manages WCF services as an NT service is a very challenging task if you want to manage all of the details and treat the NT service as a real service host. The challenges start from managing multiple Appdomains ( one for each Service ), managing the statuses of the services, startup times, deployments from the IDE and the worst of all is activation. Have you considered how to implement that? If you do not have this feature, it means that all of your services will be active and in memory at all times. IIS and Appfabric do that very well and trust me , it is noty easy to implement. The other part that was challenging was a UI to manage this host and offcourse a UI that can manage multiple hosts ( NT services running on different boxes ). Do you need a discovery proxy implementation? And at last how about if you want to manage services running in your custom host , IIS and App fabric the same way?
Think about before doing such an implementation because the scope may crypt on you as you do it.
I do something similar here.
Create a Dictionary<key, ApplicationDomain> collection into your main program
Key: something unique for each application domain, like a Guid or a System.Type.
That ApplicationDomain class exposes a internal property to access your AppDomain proxy (that which inherits a MarshallByRef class)
Load your WCF host into main program, so you'll get access to that collection
Every time your service get some access, you just need to take that key, access your proxy and do anything you want within your service hoster.
Keypoint: Your service must have access to all your service hosts.