Kiszolgálói kivételek tesztelése

Áttekintés

A PlayReady tesztkiszolgáló speciális funkciókat tartalmaz a különböző kiszolgálói kivételek programozott aktiválásához. Ez a képesség lehetővé teszi az ügyfélfejlesztők számára, hogy teszteljék, hogyan reagálnak eszközeik és alkalmazásaik különböző hibafeltételekre, amelyek az éles környezetekben történő licencvásárlás során fordulhatnak elő.

Kiszolgálói kivétel tesztelése

Az ügyfélfejlesztők ezen kiszolgálókivételi parancsokkal ellenőrizhetik a hibakezelést a megvalósításokban. Ez magában foglalja a tesztelési forgatókönyveket, például az eszköz visszavonását, a belső kiszolgáló hibáit, a protokolleltéréseket és a tartományhoz kapcsolódó kivételeket.

Példa tranzakcióra

Íme egy példa a kiszolgálói kivételek működésére:

Kérelem URL-címe:

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

Kiszolgáló válasza:

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>

Kivételparaméterek

Általános kivételparaméter

Paraméter Leírás Példa URL-címe
errorcode:XXXXXXXX A kiszolgáló kérése adott kivétellel való válaszadásra http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0xXXXXXXXX)

Eszköz- és ügyfél-kivételek

Eszköztanúsítvány visszavonva

Paraméter Kivétel Leírás
errorcode:8004C065 DRM_E_DEVCERT_REVOKED A kiszolgáló nem tud licencet kézbesíteni egy visszavont ügyféleszközre

példa:

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

Használat: Annak tesztelése, hogy az ügyfél hogyan kezeli az eszköz-visszavonási forgatókönyveket.

Belső kiszolgálói kivételek

Belső kiszolgálóhiba

Paraméter Kivétel Leírás
errorcode:8004C600 DRM_E_SERVER_INTERNAL_ERROR A kiszolgáló belső kiszolgálói kivételt jelez

példa:

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

Használat: Az ügyfél rugalmasságának tesztelése kiszolgálóoldali belső hibák esetén.

Érvénytelen üzenet

Paraméter Kivétel Leírás
errorcode:8004C601 DRM_E_SERVER_INVALID_MESSAGE A kiszolgálónak küldött kérés érvénytelen volt

példa:

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

Használat: Hibásan formázott kérésválaszok ügyfélkezelésének tesztelése.

Protokollverzió eltérése

Paraméter Kivétel Leírás
errorcode:8004C60B DRM_E_SERVER_PROTOCOL_VERSION_MISMATCH A kérésben megadott protokollverziót a kiszolgáló nem támogatja

példa:

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

Használat: Az ügyfél viselkedésének tesztelése nem támogatott protokollverziókkal.

Szolgáltatásspecifikus kivétel

Paraméter Kivétel Leírás
errorcode:8004C604 DRM_E_SERVER_SERVICE_SPECIFIC A kiszolgáló szolgáltatásspecifikus kivételt (általában a licenckezelőtől) ad ki.

példa:

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

Használat: Szolgáltatásspecifikus hibák ügyfélkezelésének tesztelése.

Protokoll- és átirányítási kivételek

Protokoll átirányítása

Paraméter Kivétel Leírás
errorcode:8004C60D DRM_E_SERVER_PROTOCOL_REDIRECT A protokoll átirányítással rendelkezik

példa:

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

Használat: Kiszolgálóátirányítások ügyfélkezelésének tesztelése.

Tartomány szükséges

Paraméter Kivétel Leírás
errorcode:8004C605 DRM_E_SERVER_DOMAIN_REQUIRED A kiszolgáló szabványos licenckérelmet kapott az ügyféltől, és megköveteli, hogy az ügyfél tartományhoz csatlakozzon, hogy tartományhoz kötött licencet kapjon

példa:

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

Használat: Tesztelje a tartománycsatlakozás forgatókönyveit és az ügyféltartomány-tudatosságot.

Tartomány megújítása

Paraméter Kivétel Leírás
errorcode:8004C606 DRM_E_SERVER_RENEW_DOMAIN A kiszolgáló egy tartománytanúsítvánnyal rendelkező ügyféltől kapott kérést, beleértve egy elavult tartományverziót is. Az ügyfélnek frissítenie kell a tartománytanúsítványát

példa:

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

Használat: Tartománytanúsítvány-megújítási folyamatok tesztelése.

Elérte az eszközkorlátot

Paraméter Kivétel Leírás
errorcode:8004C602 DRM_E_SERVER_DEVICE_LIMIT_REACHED A kiszolgáló hajlandó volt ügyfelet hozzáadni egy tartományi fiókhoz, de a fiók már elérte az eszközök számának korlátját

példa:

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

Használat: A tartományeszköz korlátainak ügyfélkezelésének tesztelése.

Nem tartományi tag

Paraméter Kivétel Leírás
errorcode:8004C60A DRM_E_SERVER_NOT_A_MEMBER A kiszolgáló érvényes tartományhoz kötött licenckérelmet kapott az ügyféltől, de az ügyfelet korábban a szolgáltatás eltávolította a tartományból

példa:

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

Használat: Az ügyfél viselkedésének tesztelése a tartományból való eltávolításkor.

Ismeretlen fiókazonosító

Paraméter Kivétel Leírás
errorcode:8004C60C DRM_E_SERVER_UNKNOWN_ACCOUNTID A kiszolgáló tartományhoz kötött licenckérelmet kapott az ügyféltől egy adott fiókazonosítóhoz, de ez az azonosító ismeretlen a szolgáltatás számára

példa:

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

Használat: Ismeretlen tartományi fiókok ügyfélkezelésének tesztelése.

Tesztelési forgatókönyvek

Alapszintű kivételtesztelés

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;
}

Tartománykivétel tesztelése

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;
}

Ügyfél robusztussági tesztelése

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
        }))
    };
}

Ügyfél-megvalósítási irányelvek

A kivételkezelés ajánlott eljárásai

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);
    }
}

C# kivételkezelés

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;
    }
}

Ellenőrzés és tesztelés

Várt viselkedések

Kiszolgálói kivételekkel végzett teszteléskor ellenőrizze, hogy az ügyfél:

  1. Kivételek helyes elemzése – Hibakódok és üzenetek helyes kinyerése
  2. Kezeli a kecsesen – Nem összeomlik vagy nem lóg kivételekkel
  3. Felhasználói visszajelzést ad – Megfelelő hibaüzeneteket jelenít meg a felhasználóknak
  4. Újrapróbálkozási logika implementálása – A megfelelő hibák újrapróbálkozása visszalépéssel
  5. Támogatja a tartományműveleteket – Helyesen kezeli a tartományhoz kapcsolódó kivételeket

Ellenőrzési ellenőrzőlista tesztelése

  • [ ] Az ügyfél helyesen azonosítja a kivételtípusokat
  • [ ] Megfelelő felhasználói üzenetek jelennek meg
  • [ ] Az ügyfél nem összeomlik kivételtípuson
  • [ ] Az újrapróbálkozás logikája helyreállítható hibák esetén működik
  • [ ] A tartománybekötési/megújítási folyamatok megfelelően aktiválódnak
  • [ ] Az eszköz visszavonása biztonságosan történik
  • [ ] A teljesítmény hibafeltételek mellett is elfogadható marad

Ajánlott eljárások

Ügyfélfejlesztés

  1. Átfogó hibakezelés – Az összes dokumentált kivételtípus kezelése
  2. Felhasználói élmény – Világos, végrehajtható hibaüzenetek megadása
  3. Újrapróbálkozási stratégia – Megfelelő újrapróbálkozási logika implementálása átmeneti hibákhoz
  4. Biztonság – Győződjön meg arról, hogy az eszköz visszavonása megakadályozza a tartalomhozzáférést
  5. Tesztelés – Az összes kivételforgatókönyv tesztelése a fejlesztés során

Hiba helyreállítása

  1. Kecses lebomlás – Ha lehetséges, folytassa a műveletet
  2. Kommunikáció törlése – A felhasználók tájékoztatása a problémákról és a megoldásokról
  3. Automatikus helyreállítás – Szükség esetén automatikus feloldás megkísérlése
  4. Tartalék beállítások – Alternatív tartalom vagy szolgáltatások biztosítása
  5. Naplózás – Naplózási kivételek hibakereséshez és elemzéshez

Támogatási erőforrások

Üzleti lekérdezések

Műveleti lekérdezések

Technikai támogatás

Képzési információk


© Microsoft Corporation. Minden jog fenntartva. Védjegyek | Magánélet