質問

私は、SharePoint 2010でこれをやっているが、問題は、SharePoint 2007に存在し、同じソリューションを持っている場合は驚かないだろう。

私は私のBDCデータのランタイムセキュリティトリマーを持っています。私は私のモデルで定義された「デフォルト」のプロファイルのURLのオフに基づいてURLを与えるためにセキュリティトリマーを期待していました。残念ながら、それはそうではありません。それは私のようなURLを与えます:    bdc3:// amms_amms /デフォルト/ 00000000% 252d0000%252d0000%252d0000%252d000000000000 / 1971 / AMMS / 1973 S_ID = ibqaaaaaaaaa =&s_ce = 07nk0004080g10003o03vvf

私は、このオブジェクト(実際には主キーの値)のプロパティを取得する必要があります。私はBDCオブジェクトモデルでこれを行う方法の任意のアイデア?次のリンクは、いくつかの助けを提供しているようだが、私は上記のURLを消費何かを見ていない。

http://msdn.microsoft.com/en-us/library/ ee556400.aspxする

<時間>

アップデート:私は、SharePoint 2007がAccessCheckerを持っていることを確認(http://msdn.microsoft.com/en-us/library/aa981124.aspx)と2010年には、おそらく同様に(2010年の良いドキュメントを見つけることができません、これを持っていますこの上)。私たちは、簡単にデータベースのセキュリティ記述子を持つことはできませんが、AccessChecker方法で十分かもしれません。

私はMicrosoft.Office.Server.Search.Connector.BDC.BdcSecurityTrimmerが何であるかであることがわかり、さらに少し掘ることはおそらくのSharePoint 2010でAccessCheckerで使用されているものURLごとにDBへのクエリを行うことが表示されます。それは(2007年の文書の請求を行うために)複数のスレッドでそれを行う場合でも非効率です。私は、単一のWebサービスの呼び出しに情報までバッチに好むだろうと思うが、フェンスにしています...

役に立ちましたか?

解決

OK、ここで私の前の回答の簡素化です。あなたが完全に反射を避けることができることが表示されます。

using Microsoft.BusinessData.Runtime;
using Microsoft.Office.Server.Search.Connector;
using Microsoft.Office.Server.Search.Query;    

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];
            string id = new Microsoft.Office.Server.Search.Connector.UriParser(new Uri(url)).QueryStringParameters["s_id"];
            ids[i] = Identity.Deserialize(id).GetIdentifierValues()[0].ToString();
        }
        catch (Exception ex)
        {
            System.Diagnostics.Trace.WriteLine("Error: " + ex.Message);
        }
    }

    return ids;
}

私のようなコードを使用してMicrosoft.Office.Server.Search.ConnectorからUriParserを使用して回避しようとしたことを注意ます:

string id = HttpUtility.ParseQueryString(new Uri(url).Query)["s_id"];
ids[i] = Identity.Deserialize(id.ToUpper()).GetIdentifierValues()[0].ToString();

残念ながら、これはいくつかのIDとない他人のために働きました。私はそれ以上を調査し、ちょうど特別UriParserを使用しないことを決めました。一例では、私が探していたIDは「5,20,21,7,8,6,14,19,17,18,4」だったが、この第2のアプローチは、5,20,21,24581,8」私を与えました24580,24588,24593,17,24592,4" 。最初の3が正しかったので、それは数分のために私をめちゃめちゃます。

他のヒント

私は確かにそれが最善の方法ですが、私は、リバースエンジニアリングのMicrosoft.Office.Server.Search.Connector.BDC.BdcSecurityTrimmerに反射板を使用して作業にこれを持っていませんよ。この小さなを簡素化するように、私は唯一のアイデンティティ値を必要に応じています。

以下は、セキュリティトリマーに提供documentCrawlUrlsの配列を受け取り、私のBDCモデルファイルで定義された主キーの配列に変換し、私のコードです。私はそれらを持っていたら、私はより多くのカスタム.NETコードを使用してトリミングセキュリティを決定することができます。

でCHECKACCESS()私のセキュリティトリマー(ISecurityTrimmer2)の私が持っています:

String[] ids = GetIds(documentCrawlUrls);

それから私は、次のプライベートメソッドを持っています:

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;
}
私は反射でカンニングので、私はSPBdcUriクラスを書き換えたくなかったし、それが内部です。私は、効率を改善することができますので、私は現在だけでアウトのいずれかのパラメータを使用します。私は反射に頼るのではなく、必要とすることSPBdcUriの部分を書き込みし直すことができる。

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;
}
ああ、ここで私の "使用" の文を示します。

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;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top