具有changelog增量爬网的自定义BCS索引连接器无法正常工作

时间:2013-06-06 09:00:23

标签: sharepoint indexing web-crawler connector bcs

我正在使用changelog incremental crawl方法编写自定义索引连接器。

我正在使用http://msdn.microsoft.com/en-us/library/ff625800%28v=office.14%29.aspx中的示例并试图为我更改它。

我的模型有下一个构造型:IdEnumerator,ChangedIdEnumerator,DeletedIdEnumerator,SpecificFinder,Finder,StreamAccessor

如果我开始完全抓取,将调用IdEnumerator,ChangedIdEnumerator,DeletedIdEnumerator。

  
    

第一个问题:未调用SpecificFinder。

  

如果我开始增量抓取,将调用ChangedIdEnumerator和DeletedIdEnumerator。

DeletedIdEnumerator正在运行:已从索引中删除已删除ID的项目。

  
    

第二个问题:ChangedIdEnumerator无效。返回更改后的ID后没有任何反应。

  

群组日志中现在有错误。

我的模特在这里:

<Model xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Name="MyFileModel" xmlns="http://schemas.microsoft.com/windows/2007/BusinessDataCatalog">
  <LobSystems>
    <LobSystem Name="MyFileSystem" Type="Custom">
      <Properties>
        <Property Name="SystemUtilityTypeName" Type="System.String">MyFileConnector.MyFileConnector, MyFileConnector, Version=1.0.0.0, Culture=neutral, PublicKeyToken=15865f58b9878bf8</Property>
        <Property Name="SystemUtilityInstallDate" Type="System.DateTime">2013-01-01 00:00:00Z</Property>
        <Property Name="InputUriProcessor" Type="System.String">MyFileConnector.MyFileLobUri, MyFileConnector, Version=1.0.0.0, Culture=neutral, PublicKeyToken=15865f58b9878bf8</Property>
        <Property Name="OutputUriProcessor" Type="System.String">MyFileConnector.MyFileNamingContainer, MyFileConnector, Version=1.0.0.0, Culture=neutral, PublicKeyToken=15865f58b9878bf8</Property>
      </Properties>
      <LobSystemInstances>
        <LobSystemInstance Name="MyFileConnector_instance">
          <Properties>
            <Property Name="AuthenticationType" Type="System.String">Credentials</Property>
         </Properties>
        </LobSystemInstance>
      </LobSystemInstances>
  <Entities>
    <Entity Name="MyFolder" Namespace="MyFileConnector" Version="1.0.0.1">
      <Properties>
        <Property Name="Title" Type="System.String">Name</Property>
      </Properties>
      <Identifiers>
        <Identifier Name="ID" TypeName="System.String" />
      </Identifiers>

      <Methods>
        <!--        IdEnumerator          -->
        <Method Name="ReadAllIds" DefaultDisplayName="ReadAllIds" IsStatic="false">
          <Parameters>
            <Parameter Name="returnIds" Direction="Return">
              <TypeDescriptor Name="Nodes" TypeName="Microsoft.BusinessData.Runtime.DynamicType[]" IsCollection="true">
                <TypeDescriptors>
                  <TypeDescriptor TypeName="Microsoft.BusinessData.Runtime.DynamicType" Name="Node">
                    <TypeDescriptors>
                      <TypeDescriptor Name="ID" TypeName="System.String" IdentifierName="ID" />
                    </TypeDescriptors>
                  </TypeDescriptor>
                </TypeDescriptors>
              </TypeDescriptor>
            </Parameter>
          </Parameters>
          <MethodInstances>
            <MethodInstance Type="IdEnumerator" Name="ReadAllIds" DefaultDisplayName="ReadAllIds" ReturnParameterName="returnIds" Default="true">
              <Properties>
                <Property Name="RootFinder" Type="System.String">true</Property>
              </Properties>
              <AccessControlList>
                <AccessControlEntry Principal="NT AUTHORITY\Authenticated Users">
                  <Right BdcRight="Execute" />
                </AccessControlEntry>
                <AccessControlEntry Principal="NT AUTHORITY\System">
                  <Right BdcRight="SetPermissions"/>
                </AccessControlEntry>
              </AccessControlList>
            </MethodInstance>
          </MethodInstances>
        </Method>
        <!--        ChangedIdEnumerator          -->
        <Method Name="ReadIncrementalList" IsStatic="false">
          <FilterDescriptors>
            <FilterDescriptor Name="LastCrawl" Type="InputOutput">
              <Properties>
                <Property Name="SynchronizationCookie" Type="System.String">x</Property>
              </Properties>
            </FilterDescriptor>
            <FilterDescriptor Name="Timestamp" Type="Timestamp" />
          </FilterDescriptors>
          <Parameters>
            <Parameter Name="lastCrawlDate" Direction="InOut">
              <TypeDescriptor Name="LastCrawlDate" TypeName="System.DateTime" IsCollection="false" AssociatedFilter="LastCrawl">
                <Interpretation>
                  <NormalizeDateTime LobDateTimeMode="Local" />
                </Interpretation>
              </TypeDescriptor>
            </Parameter>
            <Parameter Name="returnIds" Direction="Return">
              <TypeDescriptor TypeName="Microsoft.BusinessData.Runtime.DynamicType[]" Name="Nodes" IsCollection="true" >
                <TypeDescriptors>
                  <TypeDescriptor TypeName="Microsoft.BusinessData.Runtime.DynamicType" Name="Node">
                    <TypeDescriptors>
                      <TypeDescriptor TypeName="System.String" IdentifierName="ID" Name="ID" />
                    </TypeDescriptors>
                  </TypeDescriptor>
                </TypeDescriptors>
              </TypeDescriptor>
            </Parameter>
          </Parameters>
          <MethodInstances>
            <MethodInstance Name="ReadIncrementalListInstance" Type="ChangedIdEnumerator" ReturnParameterName="returnIds" Default="true">
              <AccessControlList>
                <AccessControlEntry Principal="NT AUTHORITY\Authenticated Users">
                  <Right BdcRight="Execute" />
                  <Right BdcRight="SetPermissions" />
                </AccessControlEntry>
              </AccessControlList>
            </MethodInstance>
          </MethodInstances>
        </Method>
        <!--        DeletedIdEnumerator          -->
        <Method Name="ReadDeletedIncrementalList" IsStatic="false" DefaultDisplayName="ReadDeletedIncrementalList">
          <FilterDescriptors>
            <FilterDescriptor Name="LastCrawl" Type="InputOutput">
              <Properties>
                <Property Name="SynchronizationCookie" Type="System.String">x</Property>
              </Properties>
            </FilterDescriptor>
            <FilterDescriptor Name="Timestamp" Type="Timestamp" />
          </FilterDescriptors>
          <Parameters>
            <Parameter Name="LastCrawlDate" Direction="InOut">
              <TypeDescriptor Name="LastCrawlDate" TypeName="System.DateTime" IsCollection="false" AssociatedFilter="LastCrawl">
                <Interpretation>
                  <NormalizeDateTime LobDateTimeMode="Local" />
                </Interpretation>
              </TypeDescriptor>
            </Parameter>
            <Parameter Name="deletedIds" Direction="Return">
              <TypeDescriptor  TypeName="Microsoft.BusinessData.Runtime.DynamicType[]" Name="Nodes" IsCollection="true">
                <TypeDescriptors>
                  <TypeDescriptor TypeName="Microsoft.BusinessData.Runtime.DynamicType" Name="Node">
                    <TypeDescriptors>
                      <TypeDescriptor Name="ID" TypeName="System.String" IdentifierName="ID" />
                    </TypeDescriptors>
                  </TypeDescriptor>
                </TypeDescriptors>
              </TypeDescriptor>
            </Parameter>
          </Parameters>
          <MethodInstances>
            <MethodInstance Name="ReadDeletedIncrementalListInstance" Type="DeletedIdEnumerator" ReturnParameterName="deletedIds">
              <AccessControlList>
                <AccessControlEntry Principal="NT AUTHORITY\Authenticated Users">
                  <Right BdcRight="Execute" />
                  <Right BdcRight="SetPermissions" />
                </AccessControlEntry>
              </AccessControlList>
            </MethodInstance>
          </MethodInstances>
        </Method>

        <!--        Finder          -->
        <Method Name="ReadAllItems" DefaultDisplayName="ReadAllItems" IsStatic="false">
          <Parameters>
            <Parameter Name="returnAllItems" Direction="Return">
              <TypeDescriptor TypeName="Microsoft.BusinessData.Runtime.DynamicType[]" Name="Nodes" IsCollection="true" >
                <TypeDescriptors>
                  <TypeDescriptor TypeName="Microsoft.BusinessData.Runtime.DynamicType" Name="Node">
                    <TypeDescriptors>
                      <TypeDescriptor TypeName="System.String" IdentifierName="ID" Name="ID" />
                      <TypeDescriptor TypeName="System.String" Name="Name" />
                      <TypeDescriptor TypeName="System.String" Name="Title" />
                      <TypeDescriptor TypeName="System.String" Name="Path" />
                    </TypeDescriptors>
                  </TypeDescriptor>
                </TypeDescriptors>
              </TypeDescriptor>
            </Parameter>
          </Parameters>
          <MethodInstances>
            <MethodInstance Type="Finder" Name="ReadAllItems" DefaultDisplayName="ReadAllItems" ReturnParameterName="returnAllItems" Default="true" ReturnTypeDescriptorName="Nodes" ReturnTypeDescriptorLevel="0">
              <AccessControlList>
                <AccessControlEntry Principal="NT AUTHORITY\Authenticated Users">
                  <Right BdcRight="Execute" />
                </AccessControlEntry>
                <AccessControlEntry Principal="NT AUTHORITY\System">
                  <Right BdcRight="SetPermissions"/>
                </AccessControlEntry>
              </AccessControlList>
            </MethodInstance>
          </MethodInstances>
        </Method>

        <!--        SpecificFinder          -->
        <Method Name="ReadItem" DefaultDisplayName="ReadItem" IsStatic="false">
          <Parameters>
            <Parameter Direction="In" Name="ID">
              <TypeDescriptor TypeName="System.String" IdentifierName="ID" Name="ID" />
            </Parameter>
            <Parameter Direction="Return" Name="returnParameter">
              <TypeDescriptor TypeName="Microsoft.BusinessData.Runtime.DynamicType" Name="Node">
                <TypeDescriptors>
                  <TypeDescriptor TypeName="System.String" IdentifierName="ID" Name="ID" ReadOnly="true" />
                  <TypeDescriptor TypeName="System.String" Name="Title" />
                  <TypeDescriptor TypeName="System.String" Name="Author" />
                </TypeDescriptors>
              </TypeDescriptor>
            </Parameter>
          </Parameters>
          <MethodInstances>
            <MethodInstance Type="SpecificFinder" ReturnParameterName="returnParameter" ReturnTypeDescriptorName="Node" Default="true" Name="ReadItem" DefaultDisplayName="ReadItem"  ReturnTypeDescriptorLevel="0">
              <AccessControlList>
                <AccessControlEntry Principal="NT AUTHORITY\Authenticated Users">
                  <Right BdcRight="Execute" />
                </AccessControlEntry>
                <AccessControlEntry Principal="NT AUTHORITY\System">
                  <Right BdcRight="SetPermissions"/>
                </AccessControlEntry>
              </AccessControlList>
            </MethodInstance>
          </MethodInstances>
        </Method>
      </Methods>
    </Entity>
  </Entities>
</LobSystem>

我做错了什么?我真的很感激任何意见。

2 个答案:

答案 0 :(得分:0)

您的SynchronizationCookie名称相同(&#34; x&#34;),为每个方法指定不同的Cookie名称

答案 1 :(得分:0)

我最近在我的自定义BCS连接器中遇到了类似的问题(未调用SpecificFinder)并设法对其进行排序。在我的场景中,我有两个实体(父和子),并且仅为父实体调用了SpecificFinder,但没有为子实体调用。 事实证明,问题与我构建的方式有关,并且访问URI&#34;。最初的URI是这样的:

<protocol>://<entity_name>/<entity_id>

我的起始网址(在内容来源定义中指定)是&#34;假冒&#34;的网址。父实体(没有任何ID):

<protocol>://<parent_entity_name>

但似乎SharePoint爬网程序以与Web URL相同的方式处理访问URI,并通过内容源定义中指定的URL路径应用筛选器。换句话说,就我而言,它只会抓取与以下模式相对应的URI:

<protocol>://<parent_entity_name>/*

我将访问URI格式更改为

<protocol>://root/<entity_name>

并将内容源定义中的起始网址设置为

<protocol>://root

一切都开始正常运作。