سؤال

أقوم بذلك في SharePoint 2010 ، لكن لن يفاجأ إذا كانت المشكلة موجودة في SharePoint 2007 ولديها نفس الحل.

لديّ جهاز تقليم أمان في وقت التشغيل على بيانات BDC الخاصة بي. كنت أتوقع أن يمنحني جهاز URL الخاص بعناوين URL استنادًا إلى عنوان URL "الافتراضي" المحدد في النموذج. للأسف، ليست هذه هي القضية. إنه يعطيني عنوان URL مثل: BDC3: // AMMS_AMMS/DEFAULT/00000000 ٪ 252D0000 ٪ 252D0000 ٪ 252D0000 ٪ 252D000000000000/1971/AMMS/1973؟ S_ID = IBQAAAAAA

أحتاج إلى الحصول على خصائص هذا الكائن (في الحقيقة مجرد قيمة المفتاح الأساسي). أي فكرة كيف أفعل هذا مع نموذج كائن 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 هو ما هو المحتمل ما يستخدمه AccessChecker في SharePoint 2010. يبدو أن هذا يقوم باستعلام إلى DB لكل عنوان URL. يبدو غير فعال حتى لو كان يفعل ذلك على مؤشرات ترابط متعددة (والتي تدعي وثائق 2007 القيام بها). أعتقد أنني أفضل دفع المعلومات في مكالمة خدمة ويب واحدة ، لكنني على السياج ...

هل كانت مفيدة؟

المحلول

حسنًا ، إليك تبسيط إجابتي السابقة. يبدو أنه يمكنك تجنب الانعكاس تمامًا:

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;
}

لاحظ أنني حاولت تجنب استخدام uriparser من microsoft.office.server.search.connector باستخدام رمز مثل:

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

لسوء الحظ ، كان هذا يعمل لبعض الهوية وليس الآخرين. قررت عدم التحقيق في أي شيء آخر واستخدام uriparser الخاص فقط. في أحد الأمثلة ، كانت IDS التي كنت أبحث عنها "5،20،21،7،8،6،14،19،17،18،4" لكن هذا النهج الثاني أعطاني "5،20،21،24581،8 ، 24580،24588،24593،17،24592،4 ". لقد أفسدني ذلك لبضع دقائق منذ أول 3 سنوات كانت صحيحة.

نصائح أخرى

لست متأكدًا من أنه أفضل طريقة ، لكنني حصلت على هذا العمل باستخدام Reflector لعكس Microsoft.office.server.search.connector.bdc.bdcsecuritytrimmer. كنت بحاجة فقط إلى قيمة الهوية بحيث تبسيط هذا قليلا.

فيما يلي الكود الذي يأخذ مجموعة من المستندات crawlurls المقدمة إلى جهاز تقليم الأمان وترجمتها إلى مجموعة من المفاتيح الأساسية كما هو محدد في ملف طراز 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