2017-05-21 74 views
0

我的TFS中心擴展(內部部署2015.3)由於意外的擴展數據服務行爲而無法正確加載,並且沒有獲得其所需的首選項。擴展用戶存儲 - 在首次啓動/加載中心頁面期間安裝一次 - 在集合級別上的擴展首選項,作爲鍵值對(來自擴展數據服務API的getValue/setValue),並且如果重新加載中心頁面偏好已經存儲。它就像我的集線器頁面中的應用程序嚮導/首次啓動對話框。TFS Rest API:擴展數據服務不可靠?

但是,當我在同一個TFS的另一個集合上安裝擴展並希望爲該集合存儲(= setValue)首選項時,它會返回OK(可以在F12-> Internet Explorer的網絡捕獲中看到它),但當刷新(= key上的getValue)我的集線器時,找不到這些先前輸入/存儲的鍵值對。它爲鍵提供了一個空的值,並且「首次啓動」對話框再次出現,如果鍵有值,不應該發生什麼。已經調試過,它總是在該集合中返回空(空值)。從服務沒有錯誤,沒有什麼可以捕捉,沒有什麼可以調試。

我可以在其他地方(在TFS日誌,事件查看器或數據庫)檢查更深入的調試嗎?

我也嘗試了Powershell和restcalls手動通過放置和獲取JSON的其他網站的擴展數據服務。在一個集合中它可以工作(手動和每個集線器擴展),但對於其他集合,數據服務不起作用。

擴展數據服務中是否存在2015.3中的已知問題?如果我無法在任何地方存儲擴展的首選項,我確實遇到了問題 - 將其存儲到默認的源代碼控制路徑將是另一種選擇,但我不想強制項目對於我的擴展程序簽入首選項...

編輯: 添加相關的代碼片段

function showSourceControlDialog(project: string/*TFS_Core_Contracts.TeamProjectReference*/) { 
    return Q.Promise(function (resolve, reject) { 
     //setTimeout(function() { 
     var thatProjectIDclean = project/*.id*/.replace(/-/g, "_"); 
     var enterSourceControlPathDialog = VSS_Controls_Dialogs.show(VSS_Controls_Dialogs.ModalDialog, { 
      title: "Please now enter source control path for " + thisProjectName /*project.name*/, 
      content: $("<p/>").addClass("confirmation-text").html("<label><b>Source Control Path</b> to preferences file, e.g. '$/" + thisProjectName /*thisCollectionName + "/" + project.name*/ + "/.../...xml:</label><input id='enterSourceControlPathInput' size='40'/>" /*+ projectName + ".xml"*/), 
      useBowtieStyle: true, 
      buttons: { 
       "Cancel": function() { 
        enterSourceControlPathDialog.close(); 
        enterSourceControlPathDialog.dispose(); 
        reject("cancelled"); 
       }, 
       "OK": function() { 
        sourceControlPath = $("input#enterSourceControlPathInput").val(); 
        if (sourceControlPath) { 
         setConfiguration(thatProjectIDclean, sourceControlPath).then(function (setToThisPath) { 
          console.log(setToThisPath); 
          enterSourceControlPathDialog.close(); 
          enterSourceControlPathDialog.dispose(); 
          $(".bss-button").show(); 
          $(".bss-tvc").show(); 
          resolve(sourceControlPath); 
         }).catch(function (error) { 
          reject(error); 
         }) 
        } 
       } 
      } 
     }); 
     //}, 10000); 
    }); 
} 

function setConfiguration(key: string, value: string) { 
    return Q.Promise(function (resolve, reject) { 
     // Get data service 
     VSS.getService(VSS.ServiceIds.ExtensionData).then(function (dataService: IExtensionDataService) { 
      // Set value in collection scope 
      dataService.setValue(pssVersion + "_" + key, value/*, { scopeType: "Project Collection" }*/).then(function (setToThis: string) { 
       console.log(pssVersion + "_" + key + " is now " + setToThis); 
       resolve(setToThis); 
      }, function (error) { 
       reject(error); 
       console.log(error); 
     }, function (error) { 
      reject(error); 
      console.log(error); 
     }); 
    }); 
} 

function getConfiguration(key: string) { 
    return Q.Promise(function (resolve, reject) { 
     // Get data service 
     VSS.getService(VSS.ServiceIds.ExtensionData).then(function (dataService: IExtensionDataService) { 
      // Get value in collection scope 
      dataService.getValue(pssVersion + "_" + key/*, { scopeType: "Project Collection" }*/).then(function (gotThis: string) { 
       sourceControlPath = gotThis; 
       console.log(pssVersion + "_" + key + " is " + gotThis); 
       resolve(gotThis); 
      }, function (error) { 
       reject(error); 
       console.log(error); 
      }); 
     }, function (error) { 
      reject(error); 
      console.log(error); 
     }); 
    }); 
} 

try { 
    console.log(thisProjectIDclean); 
    getConfiguration(thisProjectIDclean).then(function (resultPath: string) { 
     console.log(resultPath); 
    console.log(sourceControlPath); 
    if (!resultPath) { 
      //getProjects().then(function (resultProjects: TFS_Core_Contracts.TeamProjectReference[]) { 
      // resultProjects.forEach(function (resultProject: TFS_Core_Contracts.TeamProjectReference) { 
        showSourceControlDialog(thisProjectID/*resultProject*/).then(function() { 
         getXMLTree(); 
        }, function (error) { 
         console.log(error); 
        }); 
      // }, function (error) { 
      //  console.log(error); 
      // }); 
      //}, function (error) { 
      // console.log(error); 
      //}); 
     } else { 
      getXMLTree(); 
     } 
    }); 
} catch (error) { 
    console.log(error); 
} 
+0

您需要提供一些代碼來證明問題。 –

+0

什麼是詳細代碼?你可以在OneDrive上分享嗎?另一方面,我不認爲你可以檢查其他更深層次的調試。 –

回答

0

不幸的是你正在嘗試做的是不可能的。參照example,您可以存儲擴展數據的「最大」範圍是「項目集合」。 根據我的經驗,在處理ExtensionDataService時,無法從「外部」集合查詢數據。