Procédure : créer un fournisseur d’applications externes personnalisées
Cette rubrique fournit une vue d’ensemble du processus de création d’un fournisseur d’applications externes.
Dernière modification : jeudi 8 avril 2010
S’applique à : SharePoint Foundation 2010
La création d’un fournisseur d’applications externes personnalisé requiert la dérivation de nouvelles classes à partir de l’une ou des deux classes abstraites suivantes :
SPExternalApplicationRequestResult Il y a deux scénarios dans lesquels vous implémentez une classe dérivée de SPExternalApplicationRequestResult :
Le site et le redirecteur de requêtes où l’application externe est installée requiert que tous les résultats qu’il reçoit de Microsoft SharePoint Foundation comprenne un hachage client que le redirecteur de requêtes peut vérifier pour s’assurer que le résultat n’a pas été falsifié.
Vous souhaitez changer la façon dont SilverlightWebPart ou un certain composant WebPart personnalisé hébergeant une application non-SharePoint s’affiche, par exemple pour produire un chrome personnalisé autour du composant WebPart.
SPExternalApplicationProvider Vous devrez implémenter cette classe dans les scénarios suivants :
Dans toute situation où vous implémentez une classe dérivée de la classe SPExternalApplicationRequestResult (voir plus haut).
Le Code XML d’application externe pour le composant WebPart contient du balisage personnalisé qui doit être lu et traité.
Vous souhaitez qu’une logique spéciale s’exécute lorsque le contrôle enfant du composant WebPart est créé.
Vous souhaitez personnaliser l’interface utilisateur du SilverlightToolPart ou modifier la page d’inscription d’application qui s’ouvre lorsque vous cliquez sur le bouton Configurer du composant outil.
Important
Pour envisager si vous créez un fournisseur d’applications externes personnalisé, gardez à l’esprit qu’il ne peut y avoir qu’un seul fournisseur d’applications externes pour tous les composants WebPart qui hébergent une application dans toutes les applications Web SharePoint Foundation qui sont enfants d’un service Web spécifié.
Pour implémenter une classe de résultats de requête
Dans Microsoft Visual Studio 2010, démarrez un projet SharePoint vide.
Ajoutez un élément de classe au projet.
Définissez la classe comme héritant de SPExternalApplicationRequestResult.
Si vous ne souhaitez pas de hachage client, implémentez la propriété ClientHash qui retourne null. Si vous voulez inclure un hachage client dans les résultats renvoyés à l’application externe, implémentez la propriété ClientHash en tant que wrapper d’un champ de sauvegarde privé qui est un tableau Byte.
private Byte[] clientHash; public override Byte[] ClientHash { get { return clientHash; } }
Private clientHash_Renamed() As Byte Public Overrides ReadOnly Property ClientHash() As Byte() Get Return clientHash_Renamed End Get End Property
Si vous utilisez un hachage client, créez un constructeur qui accepte un paramètre du type SPExternalApplicationRequestProperties, et comme second paramètre un tableau d’octets (qui représente le salt client). Ce constructeur doit utiliser la propriété RequestTokenPrefix de l’objet SPExternalApplicationRequestProperties et le tableau d’octets en entrée lors de la création d’une valeur de hachage client. Le tableau d’octets doit être une valeur fournie par le serveur hébergeant l’application externe, et l’algorithme utilisé doit être le même que celui utilisé par l’application externe pour créer sa copie du hachage client. Envisagez d’utiliser les classes de l’espace de noms System.Security.Cryptography, comme HashAlgorithm ou SHA512Managed (voir l’exemple suivant). Pour utiliser la classe SHA512Managed comme dans cet exemple, vous devez ajouter une instruction using (Imports dans Visual Basic) pour l’espace de noms System.Security.Cryptography dans le fichier du code.
public CustomRequestResult() { } public CustomRequestResult(SPExternalApplicationRequestProperties externalAppRequest, byte[] clientSalt) { string prefix = externalAppRequest.RequestTokenPrefix; int nCount = Encoding.Unicode.GetByteCount(prefix); nCount += clientSalt.Length; byte[] bytes = new byte[nCount]; nCount = Encoding.Unicode.GetBytes(prefix, 0, prefix.Length, bytes, 0); for (int i = 0; i < clientSalt.Length; i++) { bytes[nCount + i] = clientSalt[i]; } // Compute the hash value SHA512Managed sha512 = new SHA512Managed(); clientHash = sha512.ComputeHash(bytes); }
Public Sub New() End Sub Public Sub New(ByVal externalAppRequest As SPExternalApplicationRequestProperties, ByVal clientSalt() As Byte) Dim prefix As String = externalAppRequest.RequestTokenPrefix Dim nCount As Integer = Encoding.Unicode.GetByteCount(prefix) nCount += clientSalt.Length Dim bytes(nCount - 1) As Byte nCount = Encoding.Unicode.GetBytes(prefix, 0, prefix.Length, bytes, 0) For i As Integer = 0 To clientSalt.Length - 1 bytes(nCount + i) = clientSalt(i) Next i ' Compute the hash value Dim sha512 As New SHA512Managed() clientHash = sha512.ComputeHash(bytes) End Sub
Si la seule partie de la classe SPExternalApplicationRequestProperties que votre classe dérivée utilise est la propriété RequestTokenPrefix, le constructeur peut accepter l’objet String comme premier paramètre, et le code appelant (qui est la méthode OnApplicationWebPartCreateChildControls(SPExternalApplicationRequestProperties) présentée plus loin) lui passe simplement la propriété RequestTokenPrefix. Une autre option consiste à concevoir le code appelant pour créer le hachage client avant de construire un objet de votre type dérivé. Dans ce cas, le constructeur du type peut être conçu pour accepter la valeur du hachage en tant que paramètre de tableau d’octets et écrire immédiatement dans le champ de stockage clientHash.
Si vous ne souhaitez pas personnaliser l’affichage du composant WebPart Silverlight ou la façon dont certains composants WebPart personnalisés hébergeant une application non-SharePoint sont affichés, implémentez la méthode GetContentControl(String) qui retourne null. Mais si vous souhaitez personnaliser l’affichage du composant WebPart, implémentez la méthode qui retourne un Control qui sera l’unique contrôle enfant du composant WebPart. En général, il s’agira d’un élément Literal contenant le balisage HTML.
Pour implémenter une classe de fournisseur d’applications externes
Ajoutez un élément de classe au projet.
Définissez la classe comme héritant de SPExternalApplicationProvider.
Si vous souhaitez personnaliser l’interface utilisateur du SilverlightToolPart, implémentez la méthode GetRegistrationInformation(SPWeb). Vous pouvez modifier l’une des cinq propriétés de l’objet SPExternalApplicationRegistrationInformation que la méthode retourne. Par exemple, pour substituer une page d’inscription personnalisée, attribuez l’URL de votre page personnalisée à la propriété HyperlinkUrl. Vous pouvez utiliser du code incorporé ou du code-behind de la page personnalisée pour fournir d’autres services aux utilisateurs. Par exemple, votre code peut lire le code XML d’application et voir s’il spécifie un nom principal d’application. Si c’est le cas, le code vérifie si cet utilisateur principal d’application existe et, s’il n’existe pas, il le crée.
L’exemple suivant remplace le nom du bouton sur la page de « Configure » en « Register », le texte explicatif du bouton, et la taille de la boîte de dialogue qu’il ouvre. Il provoque également l’ouverture par le bouton d’une page d’inscription d’application personnalisée différente (la page d’inscription par défaut est newslwp.aspx).
public override SPExternalApplicationRegistrationInformation GetRegistrationInformation(SPWeb web) { SPExternalApplicationRegistrationInformation info = new SPExternalApplicationRegistrationInformation(); info.Description = "To register a Silverlight application (.xap), click Register"; info.DialogHeight = 600; info.DialogWidth = 500; string url = web.ServerRelativeUrl; if (!url.EndsWith("/")) { url = url + "/"; } url += "_layouts/alternateReg.aspx"; info.HyperlinkText = "Register"; info.HyperlinkUrl = url; return info; }
Public Overrides Function GetRegistrationInformation(ByVal web As SPWeb) As SPExternalApplicationRegistrationInformation Dim info As New SPExternalApplicationRegistrationInformation() info.Description = "To register a Silverlight application (.xap), click Register" info.DialogHeight = 600 info.DialogWidth = 500 Dim url As String = web.ServerRelativeUrl If Not url.EndsWith("/") Then url = url & "/" End If url &= "_layouts/alternateReg.aspx" info.HyperlinkText = "Register" info.HyperlinkUrl = url Return info End Function
Si vous n’avez pas dérivé de classe de SPExternalApplicationRequestResult, vous pouvez implémenter OnApplicationWebPartCreateChildControls(SPExternalApplicationRequestProperties) pour retourner simplement null. Sinon, vous devez donner à cette méthode une implémentation conséquente pour construire et utiliser votre classe de résultats de requête.
La méthode OnApplicationWebPartCreateChildControls(SPExternalApplicationRequestProperties) est appelée par la méthode CreateChildControls du composant WebPart. Spécifiquement, la méthode CreateChildControls effectue les opérations suivantes :
Elle construit un objet SPExternalApplicationRequestProperties à partir du Code XML d’application externe qui a été utilisé pour enregistrer le composant WebPart, et à partir d’informations sur le site Web actuel.
Elle passe un objet SPExternalApplicationRequestProperties à la méthode OnApplicationWebPartCreateChildControls(SPExternalApplicationRequestProperties).
Elle reçoit un objet dérivé de SPExternalApplicationRequestResult qui est retourné par la méthode OnApplicationWebPartCreateChildControls(SPExternalApplicationRequestProperties).
Elle utilise la méthode GetContentControl(String) de l’objet de résultats de requête pour obtenir l’unique contrôle enfant du composant WebPart.
Figure 1: appels réalisés par la méthode CreateChildControls.
Si, pour une raison quelconque, la méthode OnApplicationWebPartCreateChildControls(SPExternalApplicationRequestProperties) retourne null, comme dans le fournisseur d’applications externes par défaut intégré dans SharePoint Foundation, la méthode CreateChildControls doit afficher un contrôle enfant par défaut. La méthode CreateChildControls() de la classe SilverlightWebPart intégrée procède ainsi.
Ainsi, l’opération principale de votre implémentation de la méthode OnApplicationWebPartCreateChildControls(SPExternalApplicationRequestProperties) consiste à appeler le constructeur de votre classe dérivée de SPExternalApplicationRequestResult et à retourner l’objet construit. Voici quelques points à garder à l’esprit lors du développement de votre substitution de la méthode OnApplicationWebPartCreateChildControls(SPExternalApplicationRequestProperties) :
Si votre objet dérivé de SPExternalApplicationRequestResult possède une propriété ClientHash différente de null, OnApplicationWebPartCreateChildControls(SPExternalApplicationRequestProperties) doit appeler le constructeur non défini par défaut, que vous avez créé pour votre classe dérivée de SPExternalApplicationRequestResult. OnApplicationWebPartCreateChildControls(SPExternalApplicationRequestProperties) doit passer à ce constructeur l’objet SPExternalApplicationRequestProperties qu’il a reçu en tant que paramètre lors de son appel.
Même si votre classe de résultats de requête ne donne pas une implémentation conséquente de ClientHash (et n’a donc qu’un constructeur par défaut), vous devez toujours fournir à la méthode CreateChildControls du complément WebPart un objet SPExternalApplicationRequestResult pour pouvoir appeler la méthode GetContentControl(String). C’est pourquoi vous devez implémenter la méthode OnApplicationWebPartCreateChildControls(SPExternalApplicationRequestProperties) si vous avez dérivé une classe de SPExternalApplicationRequestResult.
Une implémentation de la méthode OnApplicationWebPartCreateChildControls(SPExternalApplicationRequestProperties) peut également effectuer d’autres opérations, par exemple lire des propriétés personnalisées dans le Code XML d’application externe.
Dans l’exemple suivant, la substitution de OnApplicationWebPartCreateChildControls(SPExternalApplicationRequestProperties) appelle le constructeur non défini par défaut d’une classe dérivée de SPExternalApplicationRequestResult et nommée CustomRequestResult. Pour en savoir plus sur ce constructeur non défini par défaut, voir la procédure Pour implémenter une classe de résultats de requête plus haut dans cet article.
public override SPExternalApplicationRequestResult OnApplicationWebPartCreateChildControls( SPExternalApplicationRequestProperties args) { SPExternalApplicationRequestResult reqRes = CustomRequestResult(args, saltFromApplication); return reqRes; }
Public Overrides Function OnApplicationWebPartCreateChildControls(ByVal args As SPExternalApplicationRequestProperties) As SPExternalApplicationRequestResult Dim reqRes As SPExternalApplicationRequestResult = CustomRequestResult(args, saltFromApplication) Return reqRes End Function
Identification de votre fournisseur d’applications externes auprès du service Web
Le processus qui permet d’identifier votre fournisseur d’applications externes personnalisé auprès de SharePoint Foundation est pratiquement le même que celui pour activer un fournisseur d’applications externes, comme décrit dans Procédure : activer un fournisseur d’applications externes. La seule différence est qu’au lieu de simplement activer un fournisseur d’applications externes, vous construisez un objet du type de votre fournisseur d’applications externes, que vous affectez à la propriété ExternalApplicationSettings.Provider. Voici un exemple, où ContosoEAP est une classe dérivée de SPExternalApplicationProvider.
ContosoEAP exAppProvider = new ContosoEAP();
SPWebService.ContentService.ExternalApplicationSettings.Provider = exAppProvider;
SPWebService.ContentService.ExternalApplicationSettings.Enabled = true;
SPWebService.ContentService.Update();
Dim exAppProvider As New ContosoEAP()
SPWebService.ContentService.ExternalApplicationSettings.Provider = exAppProvider
SPWebService.ContentService.ExternalApplicationSettings.Enabled = True
SPWebService.ContentService.Update()
Conseil |
---|
La ligne qui définit la propriété Enabled n’est pas nécessaire si la gestion des applications externes a déjà été activée pour le service Web, mais elle ne présente pas de risque. Si la gestion n’a pas déjà été activée, l’inclure rend inutile la procédure de la section Procédure : activer un fournisseur d’applications externes. Cependant, dans le cas contraire, même si le fournisseur d’applications externes par défaut est utilisé, le code d’activation de la gestion doit être exécuté. |
Vous disposez de toutes les méthodes pour exécuter les lignes de code précédentes mentionnées dans Procédure : activer un fournisseur d’applications externes. L’exemple suivant montre comment exécuter le code avec l’applet de commande PowerShell Windows Add-Type dans un script d’interface de ligne de commande PowerShell.
Pour identifier votre fournisseur d’applications externes auprès du service Web
Ajoutez le code suivant dans un fichier texte.
Add-type @" using System; using Microsoft.SharePoint.Administration; namespace ContosoCmdlets public class EAPIdentifier { public static void IdentifyEAP() { ContosoEAP exAppProvider = new ContosoEAP(); SPWebService.ContentService.ExternalApplicationSettings.Provider = exAppProvider; SPWebService.ContentService.ExternalApplicationSettings.Enabled = true; SPWebService.ContentService.Update(); } } "@ -Language CsharpVersion3 [ContosoCmdlets.EAPIdentifier]::IdentifyEAP()
Enregistrez le fichier en tant que EAPIdentify.ps.
Exécutez le script dans une fenêtre Windows PowerShell.