Udostępnij przez


Testowanie wyjątków serwera

Przegląd

Serwer Test PlayReady zawiera specjalne funkcje programowe wyzwalania różnych wyjątków serwera. Ta funkcja umożliwia deweloperom klientów testowanie sposobu reagowania ich urządzeń i aplikacji na różne warunki błędów, które mogą wystąpić podczas pozyskiwania licencji w środowiskach produkcyjnych.

Testowanie wyjątków serwera

Deweloperzy klienta mogą używać tych poleceń wyjątków serwera do weryfikowania obsługi błędów w ich implementacjach. Obejmuje to scenariusze testowania, takie jak odwołanie urządzenia, wewnętrzne błędy serwera, niezgodności protokołu i wyjątki związane z domeną.

Przykład transakcji

Oto przykład działania wyjątków serwera:

Adres URL żądania:

http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c065)

Odpowiedź serwera:

HTTP/1.1 500 Internal Server Error
Cache-Control: private
Content-Length: 764
Content-Type: text/xml; charset=utf-8

<?xml version="1.0" encoding="utf-8" ?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <soap:Fault>
            <faultcode>soap:Server</faultcode>
            <faultstring>
                System.Web.Services.Protocols.SoapException: Device Certificate Revoked.
                at Microsoft.Media.Drm.RightsManager.ConvertRmServerException(RMServerException ex)
                at Microsoft.Media.Drm.RightsManager.AcquireLicense(XmlDocument challenge)
            </faultstring>
            <faultactor>http://prtsprod-rightsmanager.azurewebsites.net/rightsmanager.asmx?cfg=(errorcode:0x8004c065)</faultactor>
            <detail>
                <Exception>
                    <StatusCode>0x8004c065</StatusCode>
                </Exception>
            </detail>
        </soap:Fault>
    </soap:Body>
</soap:Envelope>

Parametry wyjątku

Ogólny parametr wyjątku

Parametr Opis Przykładowy adres URL
errorcode:XXXXXXXX Zażądaj odpowiedzi serwera z określonym wyjątkiem http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0xXXXXXXXX)

Wyjątki urządzeń i klientów

Certyfikat urządzenia został odwołany

Parametr Wyjątek Opis
errorcode:8004C065 DRM_E_DEVCERT_REVOKED Serwer nie może dostarczyć licencji na odwołane urządzenie klienckie

Przykład:

http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c065)

Użycie: przetestuj sposób obsługi scenariuszy odwoływania urządzeń przez klienta.

Wyjątki wewnętrzne serwera

Wewnętrzny błąd serwera

Parametr Wyjątek Opis
errorcode:8004C600 DRM_E_SERVER_INTERNAL_ERROR Serwer zgłasza wyjątek wewnętrzny serwera

Przykład:

http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c600)

Użycie: Testowanie odporności klienta na błędy wewnętrzne po stronie serwera.

Nieprawidłowa wiadomość

Parametr Wyjątek Opis
errorcode:8004C601 DRM_E_SERVER_INVALID_MESSAGE Żądanie wysłane do serwera było nieprawidłowe

Przykład:

http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c601)

Użycie: Testowanie obsługi źle sformułowanych odpowiedzi żądań przez klienta.

Niezgodność wersji protokołu

Parametr Wyjątek Opis
errorcode:8004C60B DRM_E_SERVER_PROTOCOL_VERSION_MISMATCH Wersja protokołu określona w żądaniu nie była obsługiwana przez serwer

Przykład:

http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c60b)

Użycie: Przetestuj zachowanie klienta z nieobsługiwanymi wersjami protokołu.

Wyjątek specyficzny dla usługi

Parametr Wyjątek Opis
errorcode:8004C604 DRM_E_SERVER_SERVICE_SPECIFIC Serwer zgłasza wyjątek specyficzny dla usługi (zazwyczaj z programu obsługi licencji)

Przykład:

http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c604)

Użycie: Testowanie obsługi błędów specyficznych dla usługi przez klienta.

Wyjątki protokołu i przekierowania

Przekierowanie protokołu

Parametr Wyjątek Opis
errorcode:8004C60D DRM_E_SERVER_PROTOCOL_REDIRECT Protokół ma przekierowanie

Przykład:

http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c60d)

Użycie: Testowanie obsługi klientów przekierowań serwera.

Wymagana domena

Parametr Wyjątek Opis
errorcode:8004C605 DRM_E_SERVER_DOMAIN_REQUIRED Serwer otrzymał standardowe żądanie licencji od klienta i wymaga, aby klient przyłączył się do domeny w celu otrzymania licencji powiązanej z domeną

Przykład:

http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c605)

Użycie: Testowanie scenariuszy dołączania do domeny i rozpoznawania domeny klienta.

Odnawianie domeny

Parametr Wyjątek Opis
errorcode:8004C606 DRM_E_SERVER_RENEW_DOMAIN Serwer odebrał żądanie od klienta z certyfikatem domeny, w tym nieaktualną wersją domeny. Wymaga, aby klient zaktualizował certyfikat domeny

Przykład:

http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c606)

Użycie: Testowanie procesów odnawiania certyfikatu domeny.

Osiągnięto limit urządzeń

Parametr Wyjątek Opis
errorcode:8004C602 DRM_E_SERVER_DEVICE_LIMIT_REACHED Serwer był gotów dodać klienta do konta domeny, ale konto osiągnęło już limit liczby urządzeń

Przykład:

http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c602)

Użycie: Testowanie obsługi limitów urządzeń domeny przez klienta.

Nie jest członkiem domeny

Parametr Wyjątek Opis
errorcode:8004C60A DRM_E_SERVER_NOT_A_MEMBER Serwer otrzymał prawidłowe żądanie licencji powiązanej z domeną od klienta, ale klient został wcześniej usunięty z domeny przez usługę

Przykład:

http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c60a)

Użycie: Przetestuj zachowanie klienta po usunięciu z domeny.

Nieznany identyfikator konta

Parametr Wyjątek Opis
errorcode:8004C60C DRM_E_SERVER_UNKNOWN_ACCOUNTID Serwer otrzymał żądanie licencji powiązanej z domeną od klienta dla określonego identyfikatora konta, ale ten identyfikator jest nieznany usłudze

Przykład:

http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c60c)

Użycie: Przetestuj obsługę klienta nieznanych scenariuszy kont domeny.

Scenariusze testowania

Podstawowe testowanie wyjątków

async function testServerExceptions() {
    const exceptions = [
        { name: 'Device Revoked', code: '0x8004c065' },
        { name: 'Internal Error', code: '0x8004c600' },
        { name: 'Invalid Message', code: '0x8004c601' },
        { name: 'Protocol Mismatch', code: '0x8004c60b' }
    ];
    
    const results = [];
    for (const exception of exceptions) {
        try {
            const url = `http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:${exception.code})`;
            const response = await testLicenseAcquisition(url);
            results.push({
                test: exception.name,
                result: 'UNEXPECTED_SUCCESS',
                error: 'Expected exception but got success'
            });
        } catch (error) {
            results.push({
                test: exception.name,
                result: 'EXPECTED_EXCEPTION',
                errorCode: error.statusCode,
                message: error.message
            });
        }
    }
    
    return results;
}

Testowanie wyjątków domeny

async function testDomainExceptions() {
    const domainExceptions = [
        { name: 'Domain Required', code: '0x8004c605' },
        { name: 'Renew Domain', code: '0x8004c606' },
        { name: 'Device Limit Reached', code: '0x8004c602' },
        { name: 'Not a Member', code: '0x8004c60a' },
        { name: 'Unknown Account', code: '0x8004c60c' }
    ];
    
    const results = [];
    for (const exception of domainExceptions) {
        try {
            const url = `http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:${exception.code})`;
            await testLicenseAcquisition(url);
            results.push({
                test: exception.name,
                result: 'FAIL',
                reason: 'Expected domain exception but got success'
            });
        } catch (error) {
            results.push({
                test: exception.name,
                result: 'PASS',
                exceptionType: exception.name,
                statusCode: error.statusCode
            });
        }
    }
    
    return results;
}

Testowanie niezawodności klienta

async function testClientRobustness() {
    // Test how client handles rapid exception scenarios
    const rapidTests = [
        '0x8004c065', // Device revoked
        '0x8004c600', // Internal error  
        '0x8004c601', // Invalid message
        '0x8004c60b'  // Protocol mismatch
    ];
    
    const startTime = Date.now();
    const promises = rapidTests.map(code => {
        const url = `http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:${code})`;
        return testLicenseAcquisitionWithTimeout(url, 5000);
    });
    
    const results = await Promise.allSettled(promises);
    const endTime = Date.now();
    
    return {
        totalTime: endTime - startTime,
        results: results.map((result, index) => ({
            errorCode: rapidTests[index],
            status: result.status,
            handled: result.status === 'rejected' // We expect rejections
        }))
    };
}

Wytyczne dotyczące implementacji klienta

Najlepsze rozwiązania dotyczące obsługi wyjątków

class PlayReadyExceptionHandler {
    handleLicenseAcquisitionError(error) {
        switch (error.statusCode) {
            case 0x8004C065: // Device revoked
                return this.handleDeviceRevoked();
                
            case 0x8004C600: // Internal server error
                return this.handleServerError(error);
                
            case 0x8004C601: // Invalid message
                return this.handleInvalidMessage(error);
                
            case 0x8004C60B: // Protocol version mismatch
                return this.handleProtocolMismatch(error);
                
            case 0x8004C605: // Domain required
                return this.handleDomainRequired(error);
                
            case 0x8004C606: // Renew domain
                return this.handleDomainRenewal(error);
                
            default:
                return this.handleUnknownError(error);
        }
    }
    
    handleDeviceRevoked() {
        // Device is revoked - cannot proceed
        throw new Error('Device has been revoked and cannot play protected content');
    }
    
    handleServerError(error) {
        // Retry with exponential backoff
        return this.retryWithBackoff(error.originalRequest);
    }
    
    handleDomainRequired(error) {
        // Initiate domain joining process
        return this.joinDomain(error.domainServiceUrl);
    }
    
    handleDomainRenewal(error) {
        // Renew domain certificate
        return this.renewDomainCertificate(error.domainServiceUrl);
    }
}

Obsługa wyjątków w języku C#

public class PlayReadyExceptionHandler
{
    public async Task<bool> HandleLicenseException(Exception ex)
    {
        if (ex is SoapException soapEx)
        {
            var statusCode = ExtractStatusCode(soapEx);
            
            switch (statusCode)
            {
                case 0x8004C065: // Device revoked
                    return HandleDeviceRevoked();
                    
                case 0x8004C600: // Internal server error
                    return await HandleServerError(soapEx);
                    
                case 0x8004C605: // Domain required
                    return await HandleDomainRequired(soapEx);
                    
                case 0x8004C606: // Renew domain
                    return await HandleDomainRenewal(soapEx);
                    
                default:
                    return HandleUnknownError(soapEx);
            }
        }
        
        return false;
    }
    
    private uint ExtractStatusCode(SoapException soapEx)
    {
        // Extract status code from SOAP fault detail
        var detail = soapEx.Detail;
        var statusNode = detail?.SelectSingleNode("//StatusCode");
        
        if (statusNode != null && uint.TryParse(statusNode.InnerText.Replace("0x", ""), 
            NumberStyles.HexNumber, null, out uint statusCode))
        {
            return statusCode;
        }
        
        return 0;
    }
}

Walidacja i testowanie

Oczekiwane zachowania

Podczas testowania z wyjątkami serwera sprawdź, czy klient:

  1. Poprawnie analizuje wyjątki — poprawnie wyodrębnia kody błędów i komunikaty
  2. Obsługuje bezpiecznie — nie ulega awarii ani nie zawiesza się na wyjątkach
  3. Udostępnia opinie użytkowników — wyświetla odpowiednie komunikaty o błędach dla użytkowników
  4. Implementuje logikę ponawiania prób — ponawia próbę odpowiednich błędów z wycofywaniem
  5. Obsługuje operacje domeny — poprawnie obsługuje wyjątki związane z domeną

Lista kontrolna sprawdzania poprawności testów

  • [ ] Klient prawidłowo identyfikuje typy wyjątków
  • [ ] Wyświetlane są odpowiednie komunikaty użytkownika
  • [ ] Klient nie ulega awarii w żadnym typie wyjątku
  • [ ] Logika ponawiania prób działa w przypadku błędów możliwych do odzyskania
  • [ ] Procesy dołączania/odnawiania domeny są poprawnie wyzwalane
  • [ ] Funkcja odwoływania urządzeń jest obsługiwana bezpiecznie
  • [ ] Wydajność pozostaje akceptowalna w warunkach błędu

Najlepsze praktyki

Rozwój klientów

  1. Kompleksowa obsługa błędów — obsługa wszystkich udokumentowanych typów wyjątków
  2. Środowisko użytkownika — podaj jasne, możliwe do działania komunikaty o błędach
  3. Strategia ponawiania prób — implementowanie odpowiedniej logiki ponawiania prób dla błędów przejściowych
  4. Zabezpieczenia — upewnij się, że odwołanie urządzenia uniemożliwia dostęp do zawartości
  5. Testowanie — testowanie wszystkich scenariuszy wyjątków podczas programowania

Odzyskiwanie błędu

  1. Łagodne obniżenie wydajności — kontynuuj operację, jeśli jest to możliwe
  2. Jasna komunikacja — informowanie użytkowników o problemach i rozwiązaniach
  3. Automatyczne odzyskiwanie — próba automatycznego rozwiązywania, jeśli jest to konieczne
  4. Opcje rezerwowe — udostępnianie alternatywnej zawartości lub usług
  5. Rejestrowanie — wyjątki dzienników na potrzeby debugowania i analizy

Zasoby pomocy technicznej

Zapytania biznesowe

Zapytania operacji

Pomocy technicznej

Informacje o szkoleniu


© Microsoft Corporation. Wszelkie prawa zastrzeżone. Znakami towarowymi | Prywatność