Die TfsWarehouse-Datenbank enthält alle wichtigen Daten, die für die Generierung und Anzeige von Berichten nötig sind. Die Informationen stammen aus den operationalen Datenbanken (z.B. Arbeitsaufgaben, Versionskontrolle), sie werden durch den Warehouse-Webservice in die TfsWarehouse-Datenbank übertragen. Der TFSServerScheduler-Dienst sorgt dafür, dass dies stündlich geschieht. Allerdings läuft der Dienst wie berichtet nur auf einem an eine Domäne angeschlossenen Server.
Als Abhilfe habe ich mir ein kleines Programm geschrieben, welches die Aktualisierung der TfsWarehouse-Datenbank durch den Webservice anstößt. In Verbindung mit der Windows-Aufgabenplanung kann dies je nach Bedarf stündlich, täglich oder in anderen gewünschten Abständen geschehen. Optimaler wäre natürlich ein eigener Dienst, aber so schwer wollte ich es mir dann auch nicht machen.
// ****************************************************************************// ****** Implementation zu wWinMain ******// ****************************************************************************int APIENTRY wWinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/, LPWSTR /*lpCmdLine*/, int /*nCmdShow*/){// Internet-Session oeffnenHINTERNET hSession = WinHttpOpen(NULL, WINHTTP_ACCESS_TYPE_NO_PROXY, NULL, NULL, 0);if (NULL != hSession){// Verbindung herstellenHINTERNET hConnect = WinHttpConnect(hSession, L"localhost", 8080, 0);if (NULL != hConnect){// Anforderung erstellenHINTERNET hRequest = WinHttpOpenRequest(hConnect, L"POST", L"/Warehouse/v1.0/warehousecontroller.asmx/Run", NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, 0);if (NULL != hRequest){// Anforderung sendenBOOL fResult = WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0);// Anforderung wurde gesendetif (fResult && WinHttpReceiveResponse(hRequest, NULL)){// Antwort abfragenchar szResponse[2048] = { 0 }; DWORD dwBytesRead = 0;WinHttpReadData(hRequest, szResponse, 2048, &dwBytesRead);}// Anforderung schliessenWinHttpCloseHandle(hRequest);}// Verbindung schliessenWinHttpCloseHandle(hConnect);}// Session freigebenWinHttpCloseHandle(hSession);}// Ans kloarreturn 0;}- Code downloaden: RunWarehouse.cpp
Es wird einfach nur eine Url aufgerufen und die Antwort abgefragt, auf eine Fehlerausgabe habe ich verzichtet. Das kompilierte Programm könnt ihr hier herunterladen.

