Fix it now
The request reached IIS and the managed pipeline that renders RD Web Access never ran, or ran and threw. The published cause of a 404.17 is an application pool that does not meet the handler’s preconditions, so start with the pool settings rather than with the files on disk.
Get-WindowsFeature Web-Asp-Net45, Web-Net-Ext45
Get-Website
Get-WebAppPoolState
- In IIS Manager, select the RDWeb application and open Basic Settings to see which pool it uses. Then open Application Pools, select that pool, and check Advanced Settings: .NET Framework Version, Managed Pipeline Mode and Enable 32-Bit Applications are the three preconditions a handler can fail.
- Turn on detailed errors for local requests in Error Pages, Edit Feature Settings, then browse to
https://localhost/RDWeb/Pagesfrom the server console and read the full substatus rather than the generic page. - At server level in IIS Manager, open ISAPI and CGI Restrictions and confirm the ASP.NET entries are Allowed. A 404.2 is that list refusing the handler outright.
- Recycle the application pool, then retest both the page and the feed URL.
404 substatuses here are not missing files. Hunting for the page on disk is the single most common way to waste an hour on this.
If the logon page renders and the feed returns resources, stop here. If you are getting a 500 rather than a 404, the next section explains which 500 you have and which are not about RD Web Access at all.
Why it happens
RD Web Access is an ASP.NET application published under the RDWeb path of a site in IIS. It does two jobs: it draws the logon and application pages users see, and it serves the feed that RemoteApp and Desktop Connections subscribes to. Both are managed code, so both depend on ASP.NET being installed, permitted to run, and reachable through a handler whose preconditions the application pool satisfies.
The 404 substatuses describe a broken pipeline rather than a missing file. Microsoft publishes 404.17 as dynamic content mapped to the static file handler, and the documented cause is specific: the handler that should take the request has preconditions, the application pool does not meet some or all of them, so the static file handler takes it instead and refuses because the request is for a dynamic resource. The preconditions are pipeline mode, bitness and .NET Framework version. Missing ASP.NET is one way to land there; it is not the definition. 404.2 is different again and simpler, and Microsoft publishes it as an ISAPI or CGI restriction: the list at server level refuses the handler.
The 500 substatuses split into two groups. 500.22 and 500.23 are published as an ASP.NET configuration that does not apply in Managed Pipeline mode, one for modules and one for handlers. Those are real and they point straight at a pool running Integrated mode against configuration written for Classic. 500.100 is a different animal entirely: Microsoft publishes it as an internal ASP error, meaning an error while processing a classic Active Server Pages page. RD Web Access is not classic ASP, so a 500.100 there is not the RDWeb application failing. If a managed page throws, you get a plain 500 and the detail lands in an ASP.NET entry in the Application log.
The application pool does not meet the handler’s preconditions
You have this one if 404.17 on every managed page, and the pool’s runtime version, pipeline mode or bitness does not match what the handler expects.
- In IIS Manager open Application Pools, select the pool the RDWeb application uses, and open Advanced Settings.
- Set .NET Framework Version, Managed Pipeline Mode and Enable 32-Bit Applications to match the handler’s requirements.
- Recycle the pool and retest before changing anything else.
This is Microsoft’s own documented resolution for 404.17, and it is the first thing to try even when you suspect ASP.NET is missing.
ASP.NET is not installed or was removed
You have this one if 404.17 persists after the pool is correct, and the ASP.NET role services report as not installed.
- Check with
Get-WindowsFeature Web-Asp-Net45, Web-Net-Ext45. - Install the missing role services with
Install-WindowsFeature Web-Asp-Net45, Web-Net-Ext45. - Restart IIS so the new handler mappings are picked up, then retest.
A cumulative update that fails part-way, or a hardening script that strips role services, is the usual reason a working server loses this.
The handler is blocked at server level
You have this one if 404.2 rather than 404.17, and the ASP.NET entries in ISAPI and CGI Restrictions are set to Not Allowed.
- Open ISAPI and CGI Restrictions at server level and set the ASP.NET entries to Allowed.
- Select the RDWeb application, open Handler Mappings, and use Revert To Inherited so the application stops overriding the server defaults.
- Recycle the pool and retest.
Classic-pipeline configuration in an Integrated-mode pool
You have this one if 500.22 or 500.23, usually after another application’s installer reconfigured the pool or wrote to web.config.
- Set the pool to Integrated pipeline mode and the runtime version the application expects, and confirm the pool is started.
- Confirm the pool identity still has rights to the RD Web content, which installers also change.
- If configuration genuinely was written for the Classic pipeline, migrate it with the appcmd migrate config command rather than editing the file by hand.
- Recycle the pool and retest.
The application starts and throws at runtime
You have this one if A plain 500 in the browser with an ASP.NET entry in the Application log at the same moment.
- Read the ASP.NET entry. It names the exception type and the request that produced it, which is the shortest route to the answer.
- Check permissions on the RD Web content folder for the pool identity, particularly after a file restore.
- Check what sits behind the feed: if the Connection Broker is unreachable, the feed page throws rather than returning an empty list.
- Compare web.config with a known-good server of the same build if the file has been edited.
Full reference
What each substatus is published as
| Code | Published meaning | Where to look first |
|---|---|---|
| 404.2 | ISAPI or CGI restriction: the requested resource is restricted on the computer | ISAPI and CGI Restrictions at server level |
| 404.17 | Dynamic content mapped to the static file handler | Application pool: pipeline mode, bitness, .NET Framework version |
| 500.22 | An ASP.NET httpModules configuration does not apply in Managed Pipeline mode | Pool pipeline mode against the module configuration |
| 500.23 | An ASP.NET httpHandlers configuration does not apply in Managed Pipeline mode | Pool pipeline mode against the handler configuration |
| 500.100 | Internal ASP error, raised while processing a classic Active Server Pages page | Not RD Web Access, which is ASP.NET. Find out which application produced it |
That last row is worth reading twice, because it is a common misdirection. 500.100 is the classic ASP substatus. RD Web Access is a managed application, so when its code throws you get a plain 500 and the useful detail is in the ASP.NET entry in the Application log, not in a substatus. A genuine 500.100 on that server points at a different application, or at something in front of IIS relabelling the response.
Seeing the substatus at all
- In IIS Manager, select the site or the RDWeb application, open Error Pages, then Edit Feature Settings.
- Set detailed errors for local requests and detailed errors, so the console shows the substatus and remote browsers keep the generic page.
- Browse from the server console rather than from your desk, or you will get the generic page and learn nothing.
- Read the IIS log for the site as well. Status and substatus are separate fields there, so a 404.17 is visible as 404 and 17 without turning detailed errors on at all.
The 404.17 detail page, and what to take from it
When detailed errors are on, the 404.17 page names the module as StaticFileModule and the handler as StaticFile. That is the diagnosis in two lines: the request that should have gone to a managed handler was taken by the static file handler instead. The handler it should have reached has preconditions, and the pool failed at least one of them. A handler with preconditions such as classic mode, a particular runtime version or 32-bit will return 404.17 whenever the pool is not in classic mode, is not 32-bit, or is not on that runtime version, so all three are worth checking rather than only the one you suspect.
When the page loads and the feed does not
- An empty feed on a working page is not an IIS problem. Look at the collection, the published RemoteApp programmes, and the user’s group membership.
- A feed that throws rather than returning an empty list usually means the Connection Broker behind it is unreachable. Check the broker before the web server.
- Subscribe a test machine to the feed URL rather than trusting the page, because the two paths do not fail identically.
- Check the IIS log for the subscription request specifically. A feed request that never reaches the server is a name or certificate problem, not a pipeline one.
What not to do
Do not remove and re-add the RD Web Access role service to clear this. That resets the site configuration, the published feed settings and any customisation of the logon pages, and it fixes a pool setting by demolition. Do not reinstall IIS either: it takes the whole deployment offline and almost never fixes anything that correcting the pool, allowing the handler and reverting the handler mappings would not. Take a copy of the RD Web folder and export the site configuration before you consider either.
None of this is a licensing problem and none of it costs anything. RD Web Access is a role service of Windows Server you have already licensed. Licence faults in Remote Desktop Services surface as licensing events on the session hosts, naming licensing explicitly, not as IIS substatus codes.
Every code this article covers
| Code | What it points at | Source |
|---|---|---|
HTTP 500.100 |
Internal ASP error: an error occurred while processing a classic Active Server Pages page. RD Web Access is ASP.NET, so this is not the RDWeb application throwing | Microsoft Learn |
HTTP 404.17 |
Dynamic content mapped to the static file handler, because the application pool does not meet the handler’s preconditions of pipeline mode, bitness or .NET Framework version | Microsoft Learn |
Event ID 1309 |
Not published by Microsoft. Written by the ASP.NET source in the Application log; the exception type and failing request are in the entry body | not published by the vendor |
HTTP 404.2 |
ISAPI or CGI restriction: the requested ISAPI or CGI resource is restricted on the computer | Microsoft Learn |
HTTP 500.22 |
An ASP.NET httpModules configuration does not apply in Managed Pipeline mode | Microsoft Learn |
HTTP 500.23 |
An ASP.NET httpHandlers configuration does not apply in Managed Pipeline mode | Microsoft Learn |
Confirm the fix worked
- The RDWeb logon page renders completely from a client, images included.
- Signing in lists the published desktops or applications.
- A test machine subscribed to the feed URL retrieves the resources.
- The IIS log records those requests with status 200 and no substatus.
- The application pool’s runtime version, pipeline mode and bitness match what the handler requires, and the pool is started.
Questions people ask about this
Is any of this a licensing problem?
No, and it costs nothing to fix. RD Web Access is a role service of Windows Server you have already licensed. Licence problems in Remote Desktop Services surface as licensing events on the session hosts, not as IIS substatus codes.
I have a 500.100. Is that RD Web Access failing?
Almost certainly not. Microsoft publishes 500.100 as an internal ASP error, meaning classic Active Server Pages. RD Web Access is ASP.NET; when its code throws you get a plain 500 and the detail lands in an ASP.NET entry in the Application log.
Where do I see the substatus rather than a generic 500?
In the IIS log for the site, where status and substatus are separate fields, and on the server console once detailed errors for local requests are enabled. Remote browsers deliberately get the generic page.
Users say the page loads but no applications appear. Same problem?
No. An empty feed on a working page points at the collection, the published RemoteApp programmes or the user’s group membership, not at the pipeline.
Should I reinstall IIS?
Almost never. It takes the deployment offline and rarely fixes anything that correcting the application pool, allowing the handler and reverting the handler mappings would not.
