An IIS HTTP 500 response means the request failed during server-side processing. Use the status details and application evidence to identify the failing layer before reinstalling runtimes or changing permissions.
IN THIS ARTICLE
01 Identify the failing request
- Record the exact URL, request time, login state and action that produced the error. Determine whether it affects one page, one application or every site.
- Open the affected site's IIS request log. Match the request and record
sc-status,sc-substatusandsc-win32-status, using the log's field header. - Compare recent deployment, configuration, runtime and credential changes. Check the application pool and actual application folder.
- Review the Application event log and the application's own protected logs at the same time. For ASP.NET Core startup failures, include events from the hosting module.
- Use local detailed errors or an isolated test copy to obtain diagnostic detail. Keep detailed errors and developer exception pages away from public visitors.
02 Capture a focused trace when needed
If the available logs do not identify the failing module, confirm the IIS Tracing role service is installed. In IIS Manager, select the site, open Failed Request Tracing Rules and add a rule for the relevant content and failing status.
Enable Failed Request Tracing for that site and set a protected output directory and bounded file count. Reproduce the issue once, inspect the trace and disable temporary collection afterwards. A trace can contain request details that should not be posted publicly.
For an ASP.NET Core startup problem, temporary module stdout logging may help. Use a directory writable by the intended pool identity, inspect the resulting error and disable the diagnostic setting when finished. Do not leave unlimited diagnostic files growing on the system volume.
03 Correct and verify
Fix the specific missing dependency, invalid configuration, permission or application exception supported by the evidence. Repeat the original request and a nearby working function. Preserve the error and change record if the application developer must continue the investigation.
04 Example: match an IIS 500 response with recent application events
In PowerShell on the affected Windows Server, collect recent application errors after recording the failed request time. This reads at most 30 warning or error events. It does not enable public detailed errors or change the website.
Get-WinEvent -FilterHashtable @{
LogName = 'Application'
Level = 2, 3
StartTime = (Get-Date).AddMinutes(-15)
} -MaxEvents 30 | Select-Object TimeCreated, ProviderName, Id, Message
Read the result: Match the provider, application and time with the IIS request log's sc-status, sc-substatus and sc-win32-status. A nearby unrelated application error is not sufficient evidence. Some application failures are written only to the application's own log or a configured tracing destination.
Use the matching exception, missing component or configuration error to choose the next investigation. Keep connection strings, request contents and customer data out of shared diagnostic excerpts. If events do not identify the cause, configure a bounded Failed Request Tracing rule for the specific failing request.
Common questions
Does every 500 error mean IIS itself is broken?
No. Application code, configuration, database access and hosting components can all contribute. The substatus and relevant logs help distinguish them.
Should I grant Everyone full control to test permissions?
Identify the denied path and actual process or request identity, then grant only the needed access. Broad write permissions can create unrelated security and isolation problems.