2013-06-06 11 views
5

Sto scrivendo un connettore di indicizzazione personalizzato utilizzando l'approccio di scansione incrementale di changelog.Il connettore di indicizzazione BCS personalizzato con indicizzazione incrementale di changelog non funziona correttamente

Sto utilizzando un campione da http://msdn.microsoft.com/en-us/library/ff625800%28v=office.14%29.aspx e provo a cambiarlo per me.

Il mio modello ha prossimi stereotipi: IdEnumerator, ChangedIdEnumerator, DeletedIdEnumerator, SpecificFinder, Finder, StreamAccessor

Se sto iniziando di scansione completa, IdEnumerator, ChangedIdEnumerator, DeletedIdEnumerator sarà chiamato.

Primo problema: lo specifico mirino non viene chiamato.

Se sto iniziando indicizzazione incrementale, ChangedIdEnumerator e DeletedIdEnumerator saranno chiamati.

DeletedIdEnumerator funziona: gli elementi con ID cancellati vengono eliminati dall'indice.

Secondo problema: ChangedIdEnumerator non funziona. Non succede niente dopo che ho restituito gli ID modificati.

Ora ci sono errori nel registro di cucitura.

Il mio modello è qui:

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

Quello che sto facendo di sbagliato? Gradirei davvero qualsiasi input.

risposta

0

avete lo stesso nome per lo SynchronizationCookie ("x"), dare un nome cookie diverso a ciascuno dei vostri metodi

0

Ho incontrato problema simile di recente (SpecificFinder non chiamato) nel mio connettore BCS personalizzato e sono riuscito a sistemalo. Nel mio scenario ho due entità (genitore e figlio) e SpecificFinder è stato chiamato solo per le entità genitore, ma non è stato chiamato per quelle figlio. Si è scoperto che il problema era legato al modo in cui ho costruito "gli URI di accesso". Inizialmente gli URI erano come questo:

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

E il mio URL iniziale (specificato nella definizione sorgente di contenuto) è stato un URL di una controllante "falso" (senza alcun ID):

<protocol>://<parent_entity_name> 

Ma sembra che il crawler di SharePoint tratti gli URI di accesso allo stesso modo degli URL Web e applica un filtro per il percorso URL specificato nella definizione dell'origine del contenuto.In altre parole, nel mio caso, sarebbe strisciare solo URI corrispondenti al seguente schema:

<protocol>://<parent_entity_name>/* 

Dopo che ho cambiato il mio accesso formato URI per

<protocol>://root/<entity_name> 

e impostare il mio URL iniziale nella sorgente di contenuti definizione a

<protocol>://root 

tutto ha funzionato correttamente.