Sharepoint 如何从BDC URL加载BDC数据?

Sharepoint 如何从BDC URL加载BDC数据?,sharepoint,bdc,bcs,Sharepoint,Bdc,Bcs,我是在SharePoint 2010中这样做的,但如果SharePoint 2007中存在此问题并且有相同的解决方案,我也不会感到惊讶 我的BDC数据上有一个运行时安全微调器。我希望安全微调器根据模型中定义的“默认”配置文件URL为我提供URL。不幸的是,情况并非如此。它给了我一个URL,如: bdc3://amms_-amms/default/00000000%252d0000%252d0000%252d0000%252d0000%252D0000000/1971/amms/1973?s_id

我是在SharePoint 2010中这样做的,但如果SharePoint 2007中存在此问题并且有相同的解决方案,我也不会感到惊讶

我的BDC数据上有一个运行时安全微调器。我希望安全微调器根据模型中定义的“默认”配置文件URL为我提供URL。不幸的是,情况并非如此。它给了我一个URL,如: bdc3://amms_-amms/default/00000000%252d0000%252d0000%252d0000%252d0000%252D0000000/1971/amms/1973?s_id=ibqaaaaaaaa=&s_ce=07nk0004080g10003o03vvf

我需要得到这个对象的属性(实际上只是主键值)。你知道我是如何使用BDC对象模型实现这一点的吗?下面的链接似乎提供了一些帮助,但我还没有看到任何使用上述URL的内容


更新:我看到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查询数据库。即使它在多个线程上运行(2007年的文档声称这样做),也似乎效率低下。我想我更愿意将信息批量添加到单个web服务调用中,但我对此持怀疑态度……

我不确定这是否是最好的方法,但我通过使用Reflector对Microsoft.Office.Server.Search.Connector.BDC.BdcSecurityTrimmer进行反向工程实现了这一点。我只需要标识值,这样就简化了一点

下面是我的代码,它获取提供给安全微调器的DocumentScrawlURL数组,并将它们转换为BDC模型文件中定义的主键数组。一旦我有了这些,我就可以使用更多的自定义.NET代码来确定安全性调整

在我的security trimmer(IsSecurity trimmer 2)的CheckAccess()中,我有:

然后我有以下私有方法:

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;
}
哦,这是我的“使用”声明:

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;

好的,这是我先前答案的简化。看来您完全可以避免反射:

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

不幸的是,这对某些Id有效,而对其他Id无效。我决定不做进一步的调查,只使用特殊的URI解析器。在一个例子中,我寻找的ID是“5,20,21,7,8,6,14,19,17,18,4”,但第二种方法给了我“5,20,2124581,8245802458824593,1724592,4”。自从前3个是正确的以来,这让我困惑了几分钟。

Sharepoint 2010没有“BDC”,它有“BCS”,它被重命名,但Sharepoint 2010中的BCS有BDC模型文件,并且该首字母缩略词在整个Sharepoint 2010 API中都使用。
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;
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;
}
string id = HttpUtility.ParseQueryString(new Uri(url).Query)["s_id"];
ids[i] = Identity.Deserialize(id.ToUpper()).GetIdentifierValues()[0].ToString();