vitaly-t vitaly-t - 2 months ago 11
ASP.NET (C#) Question

Accessing pre-configured IIS response headers from a web service

How to access IIS-configured response headers from a Web API 2 service?

In my IIS configuration there is a pre-configured response header

Environment=DEV
, which I need to check to figure out which environment settings to use.

When I check headers in my current response via
HttpContext.Current.Response.Headers
, I'm only seeing
Server
, and nothing else.

Answer

I don't think you should dependent on response headers as they are added to response by IIS at a very later stage in the pipeline and the control is already out of WEB API.

If you have to do this you can go with URL Rewrite + Server Variables. Install URL Rewrite and add a rule in your web.config under system.webServer as below

<rewrite>
    <rules>
        <rule name="GetEnvironmentInfo">
            <match url=".*" />
            <serverVariables>
                <set name="Environment" value="Dev" />
            </serverVariables>
            <action type="Rewrite" url="{R:0}" />
        </rule>
    </rules>
</rewrite>

Also you can add this rule from IIS UI. Now depending upon webAPI configuration you can fetch server variables using below code

string output = string.Empty;
if (Request.Properties.ContainsKey("MS_HttpContext"))
{
    output = ((System.Web.HttpContextWrapper)Request.Properties["MS_HttpContext"]).Request.ServerVariables["Environment"];
}
else if (Request.Properties.ContainsKey("MS_OwinContext"))
{
    var httpContextWrapper = ((OwinContext)Request.Properties["MS_OwinContext"]).Environment["System.Web.HttpContextBase"] as HttpContextWrapper;
    output = httpContextWrapper.Request.ServerVariables["Environment"];
}

The above XML can be generated from IIS GUI at server level

1.Install URL Rewrite.

2.Open IIS Manger (Windows Run -> Inetmgr)

3.Select Server in left menu

4.In the central pane double click URL Rewrite. In the Actions pane on the right hand side click Add Rule

5.Set values as below

enter image description here

and the save.

This will add same XML but now at the server level i.e. in C:\Windows\System32\inetsrv\Config\applicationHost.config file

        <globalRules>
            <rule name="GetEnInfo">
                <match url=".*" />
                <action type="Rewrite" url="{R:0}" />
                <serverVariables>
                    <set name="Environment" value="dev" />
                </serverVariables>
            </rule>
        </globalRules> 

Regarding fetching response headers from IIS there could be a way but I wouldn't recommend it due to the reason mentioned in the beginning of the answer.

Hope this helps.