WCF service is unavailable after app pool recycles
I'm working on a website that consumes a WCF service hosted in a different app pool, and every time the WCF service's app pool recycles I get a 503 when I'm using the website:
[WebException: The remote server returned an error: (503) Server Unavailable.] System.Net.HttpWebRequest.GetResponse() +6440728 System.ServiceModel.Channels.HttpChannelRequest.WaitForReply(TimeSpan timeout) +55 [ServerTooBusyException: The HTTP service located at http://cr.genesis.dev/Genesis/RepositoryService.svc is unavailable. This could be because the service is too busy or because no endpoint was found listening at the specified address. Please ensure that the address is correct and try accessing the service again later.] ...
When I try to access the service directly in my web browser it gives me a 503 the first time, but then it works after that (presumably it's causing the application to start?) I'm wondering why the website isn't waking up the web service - even if I try loading a page several times I still get a 503...
I'm using Windsor WCF Integration if that makes any difference, using LifestylePerWebRequest for my client and LifestylePerThread for my service.
This is my config for the service:
<system.serviceModel> <services> <service name="Genesis.Repository.Service.RepositoryService" behaviorConfiguration="repositoryServiceBehaviour"> <host> <baseAddresses> <add baseAddress="http://cr.genesis.dev/Genesis/" /> </baseAddresses> </host> <endpoint name="basicHttpBinding" address="RepositoryService.svc" binding="basicHttpBinding" contract="Genesis.Repository.Service.IRepositoryService" /> </service> </services> <behaviors> <serviceBehaviors> <behavior name="repositoryServiceBehaviour"> <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> <serviceMetadata httpGetEnabled="true" /> <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> <serviceDebug includeExceptionDetailInFaults="false"/> </behavior> </serviceBehaviors> </behaviors> <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" /> </system.serviceModel>
And the client:
<system.serviceModel> <client> <endpoint name="basicHttpBinding" address="http://cr.genesis.dev/Genesis/RepositoryService.svc" binding="basicHttpBinding" contract="Genesis.Repository.Service.IRepositoryService" /> </client> </system.serviceModel>
Any suggestions would be appreciated!
Looks like I was making it more complicated than it needed to be - I'd been getting exceptions saying it couldn't listen on http://+:80 which is why I'd played around with netsh permissions and made it listen on /Genesis.
Turns out I can just make it listen on / and specify .Hosted() when registering it with Windsor to tell it to let IIS host it (which is exactly how it was before I installed the WcfFacility!)
Lesson learned, sometimes you just have to go back to basics and things will work as intended!