Configurer ASP.NET l'API Web de l'application en tant que Répertoire Virtuel sous ASP.NET application MVC
En raison des différentes exigences techniques, j'ai besoin de développer une nouvelle ASP.NET application d'API Web (nommé en tant que BarApp) dans le même domaine d'Application d'une application existante (nommé en tant que FooApp).
Je voudrais configurer un ASP.NET l'API Web application (BarApp) comme un répertoire virtuel dans le cadre d'un ASP.NET application MVC (FooApp) sur IIS 8.5. Bien que de nombreux de nombreux postes parlé de la façon de configurer un répertoire virtuel, aucune de ces travaux.
Voici l'extrait de code de configuration
<site name="FooApp" id="3" serverAutoStart="true">
<application path="/" applicationPool="FooApp">
<virtualDirectory path="/" physicalPath="E:\FooApp" />
<virtualDirectory path="/Bar" physicalPath="E:\BarApp" />
</application>
<bindings>
<binding protocol="https" bindingInformation="*:34566:" sslFlags="0" />
</bindings>
</site>
Voici le site internet de la structure:
-FooApp
|
|--Bin
|--View
|--Bar (as a virtual directory)
|
|--Bin
|--View
Dans les Foo Application, j'ai configuré le routage: ajouter une ingore itinéraire pour tous chemin avec Bar
--RouteConfig.cs
namespace FooApp
{
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("{*path}", new { path = @"Bar\/(.*)" });
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
}
--WebApiConfig, garder le générés automatiquement.
namespace FooApp
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
//Web API configuration and services
//Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
}
Dans le BarApp, le routage configurer est modifié comme:
--RouteConfig.cs
namespace BarApp
{
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "Bar/{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
}
--WebApiConfig
namespace BarApp
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
//Web API configuration and services
//Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "Bar/api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
}
Cependant, la configuration ci-dessus ne fonctionne pas, et l'ignorer route ne semble pas pris en compte.
Impossible d'accéder à la page de la Barre: https://mywebsite.test.com:4433/Bar/
Erreur HTTP 403.14 - Interdit
Le serveur Web est configuré pour ne pas afficher le contenu de ce répertoire.
Impossible d'accéder à l'API Web de la Barre: https://mywebsite.test.com:4433/Bar/api/values
Erreur HTTP 404.0 - introuvable
La ressource que vous recherchez a été supprimée, que son nom ait changé ou est temporairement indisponible.
l'API Web de la bibliothèque est 2.2.1
OriginalL'auteur Innovation Wang | 2014-03-01
Vous devez vous connecter pour publier un commentaire.
Je pense que le problème avec votre approche est d'essayer d'accueillir une Asp.Net application à l'intérieur d'un Répertoire Virtuel. Plutôt, vous devez ajouter un enfant Application:
Puis modifiez le web.config de la racine de l'application pour éviter de configuration des collisions:
Référence: Désactiver l'héritage des enfants d'applications et validateIntegratedModeConfiguration et inheritInChildApplications clash.
De cette façon, vous serez en mesure d'accéder à votre enfant de l'api web sans modifier tout le code c#:
OriginalL'auteur Augusto Barreto
Je n'ai pas le programme d'installation de l'application virtuelle à l'aide de fichiers de configuration (uniquement via IIS et publier), mais je crois que le problème que vous rencontrez est la compréhension de la façon dont l'itinéraire URL est mappé dans une application virtuelle. Pour le suivant, supposons que votre FooApp a un DNS mis à fooapp (
http://fooapp/
).Si vous avez une Barre d'application virtuelle sous fooapp, la racine de la Barre de site web sera
http://fooapp/Bar
. Si l'on regarde votre parcours définitions (MVC et WebApi):Vos deux itinéraires sont mis à écouter un
Bar
"répertoire" en vertu de l'application en cours d'exécution. Si votre WebApi application, nous avons publié sur son propre (disons sur localhost), ce seraithttp://localhost/Bar
. Mais vous êtes en fait en vertu dehttp://fooapp/Bar
et ça sera la capture de la demande basée sur ce chemin de la racine qui seraithttp://fooapp/Bar/Bar
(donchttp://fooapp/Bar/Bar/api/values
, etc..).Autant que d'ignorer les routes va, si il n'y a pas de contrôleur de gestion d'une route sur
/Bar
dans leFooApp
, l'application va dire IIS qu'il ne sait pas comment traiter la demande et de services internet (IIS), puis de passer à d'autres Gestionnaires (statique des gestionnaires de fichiers, et ainsi de suite). Prenons votre demande à titre d'exemple (https://mywebsite.test.com:4433/Bar/
). Puisque c'est en vertu d'une application virtuelle, il sera demandé auBar
demande si elle peut gérer une/
route. Depuis votre itinéraire définitions dans la Barre d'application ne gère/Bar/{tokens}
, il sera par défaut le gestionnaire de fichier statique (qui dans ce cas serait l'exploration de répertoire) et le retour d'une 403 en raison de la configuration.Si vous prenez votre deuxième exemple (
https://mywebsite.test.com:4433/Bar/api/values
), il sera demandé au Bar demande si elle peut gérer/api/values
qui il ne peut pas (rappelez-vous, il peut gérer/Bar/api/values
, pas/api/values
). Depuis votre application ne peut pas, il va revenir pour les autres gestionnaires et personne ne sera en mesure de répondre à la demande et retourner une erreur 404.À partir des journaux de suivi, je ne vois GENERAL_CHILD_REQUEST_START événement, les détails sont les suivants: SiteId: 6 RequestURL:localhost:4433/Bar/api/ RequestVerb:OBTENIR RecursiveLevel:1, Mais GENERAL_CHILD_REQUEST_END retour de l'événement d'erreur 404.
Veuillez quelqu'un doit appeler quelqu'un à microsoft pour résoudre ce problème. Im maintenant avoir à revenir à des méthodes de page jusqu'à ce que je peux obtenir que cela fonctionne
grande réponse merci!
OriginalL'auteur Simon Belanger
J'ai eu le même problème. la solution est simple: dans les deux
MVC
RouteConfiguration
vous avez besoin de les routes de l'enfant virtuel de l'application (ici si vous avez de la barre de sous foo, foo besoins de connaître le bar-routes).Pour bar app vous avez besoin de les itinéraires documenté par Simon!
Salutations
Tara
OriginalL'auteur TaraJu