Je ne suis pas sûr que ce soit la meilleure approche, mais j'ai eu ce travail en utilisant Reflector à reverse engineering Microsoft.Office.Server.Search.Connector.BDC.BdcSecurityTrimmer. J'avais seulement besoin de la valeur d'identité pour que cela soit simplifié un peu. Ci-dessous est mon code qui prend un tableau de documentCrawlUrls fourni au coupe-bordure de sécurité et les traduit en un tableau de clés primaires tel que défini dans mon fichier de modèle BDC. Une fois que j'ai ceux que je peux déterminer la coupe de sécurité en utilisant plus de code .NET personnalisé.
Dans CheckAccess() de ma coupe de sécurité (ISecurityTrimmer2) Je:
String[] ids = GetIds(documentCrawlUrls);
Ensuite, je la méthode privée suivante:
private string[] GetIds(IList<string> documentCrawlUrls)
{
string[] ids = new String[documentCrawlUrls.Count];
for (int i = 0; i < documentCrawlUrls.Count; i++)
{
try
{
string url = documentCrawlUrls[i];
Identity identity = null;
IEntity entity = null;
ILobSystemInstance lsi = null;
ParseUri(url, out entity, out identity, out lsi);
if (identity != null)
{
object[] values = identity.GetIdentifierValues();
if (values.Length > 0)
{
ids[i] = values[0].ToString();
}
}
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine("Error: " + ex.Message);
}
}
return ids;
}
je ne voulais pas réécrire la classe SPBdcUri et c'est interne, alors je triche avec la réflexion. Actuellement, je n'utilise que l'un des paramètres out pour améliorer mon efficacité. Je peux réécrire les parties de SPBdcUri dont j'ai besoin au lieu de recourir à la réflexion.
private void ParseUri(string crawlUri, out IEntity entity, out Identity identity, out ILobSystemInstance lsi)
{
//SPBdcUri uri = new SPBdcUri(new Uri(crawlUri));
AssemblyName assemblyName = new AssemblyName("Microsoft.Office.Server.Search.Connector, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c");
Assembly assembly = Assembly.Load(assemblyName);
Type spBdcUriType = assembly.GetType("Microsoft.Office.Server.Search.Connector.BDC.SPBDC.SPBdcUri");
object uri = Activator.CreateInstance(spBdcUriType,
BindingFlags.NonPublic | BindingFlags.Instance,
null, new object[] { new Uri(crawlUri) }, System.Globalization.CultureInfo.CurrentCulture);
//uri.DoOverrideBDCThrottlingLimits = false;
spBdcUriType.InvokeMember("DoOverrideBDCThrottlingLimits",
BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetProperty,
null, uri, new object[] { false });
//entity = uri.Entity;
object entityObj = spBdcUriType.InvokeMember("Entity",
BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty,
null, uri, null);
entity = (IEntity)entityObj;
//identity = uri.Identity;
object identityObj = spBdcUriType.InvokeMember("Identity",
BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty,
null, uri, null);
identity = (Identity)identityObj;
//lsi = uri.LobSystemInstance;
object lsiObj = spBdcUriType.InvokeMember("LobSystemInstance",
BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty,
null, uri, null);
lsi = (ILobSystemInstance)lsiObj;
}
Oh, voici mon "en utilisant" déclarations:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using Microsoft.BusinessData.MetadataModel.Collections;
using Microsoft.BusinessData.MetadataModel;
using Microsoft.BusinessData.Runtime;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Administration;
using Microsoft.SharePoint.BusinessData.SharedService;
using Microsoft.Office.Server.Search.Query;
Sharepoint 2010 n'a pas de "BDC" il a "BCS" –
Il a été renommé, mais BCS dans SharePoint 2010 contient des fichiers de modèle BDC et cet acronyme est utilisé dans l'API SharePoint 2010. –