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 oeffnen
HINTERNET hSession = WinHttpOpen(NULL, WINHTTP_ACCESS_TYPE_NO_PROXY, NULL, NULL, 0);
if (NULL != hSession)
{
// Verbindung herstellen
HINTERNET hConnect = WinHttpConnect(hSession, L"localhost", 8080, 0);
if (NULL != hConnect)
{
// Anforderung erstellen
HINTERNET 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 senden
BOOL fResult = WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0);
// Anforderung wurde gesendet
if (fResult && WinHttpReceiveResponse(hRequest, NULL))
{
// Antwort abfragen
char szResponse[2048] = { 0 }; DWORD dwBytesRead = 0;
WinHttpReadData(hRequest, szResponse, 2048, &dwBytesRead);
}
// Anforderung schliessen
WinHttpCloseHandle(hRequest);
}
// Verbindung schliessen
WinHttpCloseHandle(hConnect);
}
// Session freigeben
WinHttpCloseHandle(hSession);
}
// Ans kloar
return 0;
}
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.