Intégrer une application ASP.Net MVC 3 sous un site Web IIS hébergeant SharePoint Server 2010

SharePoint Foundation / Server 2010 utilisent le .NET Framework 3.5. Même si le pool d’application indique 2.0, SharePoint charge la version 3.5.

image

Les projets de développement Web récents utilisent souvent ASP.Net MVC 3 avec le .NET Framework 4.0. J’avais donné la recette pour intégrer ce type de projet sous WSS 3.0 / SharePoint 2007 mais il y a quelques étapes qui sont différentes avec 2010. En bleu j’ai mis les nouveaux éléments et en orange ceux qui sont un peu différents. Les étapes qui ne sont pas nécesaires ont été enlevées tout simplement.

  1. Vous devez créer un “Application Pool” utilisant le “.NET Framework 4.0” et empruntant la même identité (le même compte de service) que l’ “Application Pool” de SharePoint.Puisque le site IIS a un SPN unique (ex. HTTP/nomgentil.domaine.com), celui-ci est déjà défini sur le compte de service en question. Ainsi, il suffira d’ajouter la déléguation vers SQL Server ou SSAS à ce compte selon ce que fait l’application ASP.Net.
  2. Vouspouvezcopier le répertoire de votre application ASP.Net sous le répertoire contenant SharePoint. Ex. C:\Inetpub\wss\nomgentil.domain.com\ApplicationMVCNote: Vous pouvez le mettre ailleurs mais cela fonctionne très bien à cet endroit.
  3. Les permissions par défaut ne sont pas les même que pour les sites placés directement sous C:\Inetpub alors assurez-vous de donner les permissions Windows à Users ou autre au répertoire de votre application MVC.
  4. Il faut convertir le virtual directory en application dans IIS en prenant bien soin d’utiliser le pool d’application défini précédemment.
  5. Une application ASP.Net utilise un fichier Web.Config afin de configurer différents éléments propres à .Net. Ce qu’il faut savoir c’est qu’il y a un lien d’héritage entre les Web.Config des applications Web. Ainsi si l’application B est placée sous l’application A dans IIS, elle hérite du Web.Config.Le problème c’est qu’en étant sous SharePoint, on hérite de certains éléments incompatibles avec une application utilisant le “.NET Framework 4.0”.

    Il faut donc modifier le web.config de SHAREPOINT pour indiquer qu’on ne souhaite pas hériter de certaines sections dans les sites enfants. Plus spécifiquement, il faut entourer les noeuds <microsoft.sharepoint.client>, <SharePoint>,  <system.web>, <System.Workflow.ComponentModel.WorkflowCompiler>, <ReportingServices>, <system.web.extensions>, <Bpm> et <reportserver> d’un noeud <location path=”.” inheritInChildApplications=”false”>. Par exemple:

    <location inheritinchildapplications= »false » path= ». »>
    <system.web>…</system.web>
    </location>

     

  6. Il faut maintenant déplacer l’élément Xml <sectionGroup> nommé “system.web.extensions” du Web.Config de SharePoint vers le Web.Config qui se trouve à cet endroit: C:\Windows\Microsoft.NET\Framework64\v2.0.50727\CONFIG\Web.Config.

    On doit le mettre sous le noeud <configSections> directement sous <configuration>:

    <configuration>
    <configSections>
    <sectionGroup name= »system.web.extensions » …

    La raison est que le site ASP.Net MVC 3 .NET 4 hérite du Web.Config de SharePoint et ce sectionGroup cause une erreur. On ne peut pas utiliser l’élément <location> à cet endroit. En déplaçant la déclaration directement dans le Web.Config du .NET Framework 2.0, SharePoint en héritera mais pas notre application ASP.Net.

    Vous pouvez obtenir plus d’information ici. Un extrait:

    Move the configSections definition in the Web.config file of the parent application (the application that runs ASP.NET 2.0 or ASP.NET 3.5) into the root Web.config file for the.NET Framework 2.0. The IIS 7 and IIS 7.5 native configuration system scans the configSections element when it merges the hierarchy of configuration files. Moving the configSections definition from the parent Web application’s Web.config file to the root Web.config file effectively hides the element from the configuration merge process that occurs for the child ASP.NET 4 application.

  7. On hérite aussi des Modules du site SharePoint et ceux-ci causent une erreur (en particulier SharePoint14Module). La solution est d’utiliser ce noeud <modules> dans votre application ASP.Net:

    <modules runAllManagedModulesForAllRequests= »true »>
    <remove name= »SPRequestModule » />
    <remove name= »PublishingHttpModule » />
    <remove name= »RSRedirectModule » />
    <remove name= »StateServiceModule » />
    <remove name= »SharePoint14Module » />
    <add name= »Session » type= »System.Web.SessionState.SessionStateModule » />
    </modules>

    Notez qu’en plus d’enlever les modules spécifiques à SharePoint, on réactive la gestion des Session. Si vous ne le faites pas, vous ne pourrez pas utiliser l’objet Session.

    En fait, comme on ne peut pas utiliser la clause <location> pour <system.webServer>, il faut défaire ce qui est fait par SharePoint. Il se peut que votre implantation nécessite d’activer / désactiver certains modules / “Http Handlers”. Voici un extrait de ce que SharePoint active / désactive:

    <modules runAllManagedModulesForAllRequests= »true »>
    <remove name= »AnonymousIdentification » />
    <remove name= »FileAuthorization » />
    <remove name= »Profile » />
    <remove name= »WebDAVModule » />
    <remove name= »Session » />
    <add name= »SPRequestModule » … />
    <add name= »ScriptModule »  … />
    <add name= »SharePoint14Module » … />
    <add name= »StateServiceModule » … />
    <add name= »RSRedirectModule » … />
    <add name= »PublishingHttpModule » … />
    </modules>
    <handlers>
    <remove name= »OPTIONSVerbHandler » />
    <remove name= »WebServiceHandlerFactory-Integrated » />
    <remove name= »svc-Integrated » />
    <remove name= »WebDAV » />
    <add name= »svc-Integrated » … />
    <add name= »OwssvrHandler » … />
    <add name= »ScriptHandlerFactory » … />
    <add name= »ScriptHandlerFactoryAppServices » … />
    <add name= »ScriptResource » …  />
    <add name= »JSONHandlerFactory » … />
    <add name= »ReportViewerWebPart » … />
    <add name= »ReportViewerWebControl » … />
    </handlers>

     

  8. IIS Reset
  9. Si vous avez une erreur qui dit que le fichier de configuration n’est pas accessible, donnez temporairement les droits en lecture au groupe local IIS_IUSRS sur ce fichier (l’erreur indique le chemin d’accès).

    Quand IIS n’arrive pas à déterminer l’authentification utilisée (ex. il y a un nœud dupliqué dans les web.config parent et enfant), il doit avoir accès en mode anonyme. Après l’erreur qui sera affichée sera détaillée (ex. le nœud qui ne peut être redéfini etc.)

  10. Si vous avez une erreur HTTP 500 ou une page blanche, même avec customErrors à OFF, vous pouvez utiliser la fonctionnalité des Failed Request Tracing (FREB). Voici comment l’activer pour un site / application.

    C’est ainsi que j’ai su qu’il me fallait désactiver le module SharePoint14Module:

    Request Diagnostics HTTP 500

Bref, oui c’est possible de mettre une application ASP.Net MVC 3 sous SharePoint 2010 mais il faut quand même effectuer un certain nombre de manipulations …

Bonne chance et à la prochaine …

Une réflexion sur “Intégrer une application ASP.Net MVC 3 sous un site Web IIS hébergeant SharePoint Server 2010

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s