我的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);
}
您需要提供一些代碼來證明問題。 –
什麼是詳細代碼?你可以在OneDrive上分享嗎?另一方面,我不認爲你可以檢查其他更深層次的調試。 –