Ok, I figured this out and reproduced it in a test environment. It is because of the routing.
In MVC when you use a generic catch all route like you did here:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
It will always treat index as the default action mapped to the root of the controller. So localhost/somecontroller will always call index, and the url will load index at either localhost/somecontroller or localhost/somecontroller/index.
There are 2 ways to solve this problem starting with the easiest
Solution 1:
On the service controller, don't name your method Index, name it anything else, like NotIndex, IDoStuff, whatever. Just doing that will cause the redirect to redirect to Service/IDoStuff (w/e). However, doing this method means localhost/appname/service will produce a 404 (as the default action "Index" does not exist).
Solution 2: Allows you to keep actions named Index
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Home",
url: "Home/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "Service",
url: "Service/Index/{id}",
defaults: new { controller = "Service", action = "Index", id = UrlParameter.Optional }
);
Solution 2 Problem
Specifying strict routes like this, breaks your default route catch all, and if you bring the default catch all route back your back to your original problem, because MVC will go through the collection of routes and apply each route to the url until it finds one that matches, the first one that matches is the one it uses, if it finds no matching route, then bam 404 (Page not found/no resource).
However, like you I want strict urls, not defaulting, so what I did is I used Solution 2.
Then to get back my root url loading Home -> Index I added a rewrite rule to my web.config
<system.webServer>
<rewrite>
<rules>
<rule name="RootRedirect" stopProcessing="true">
<match url="^$" />
<action type="Redirect" url="/Home/Index/{R:0}" />
</rule>
</rules>
</rewrite>
</system.webServer>
For that to work you need to have the UrlRewrite features enabled in IIS (installed) so that it exists in the gac/machine config etc.
Also the reroute rule appears to be a permanent redirect rule, so the browser will redirect to it without making 2 requests to the server once the client browser has visited the site one time before.