Delen via


Server-uitzonderingen testen

Overzicht

De PlayReady-testserver bevat speciale functionaliteit voor het programmatisch activeren van verschillende server-uitzonderingen. Met deze mogelijkheid kunnen clientontwikkelaars testen hoe hun apparaten en toepassingen reageren op verschillende foutvoorwaarden die kunnen optreden tijdens het verkrijgen van licenties in productieomgevingen.

Server-uitzonderingstests

Clientontwikkelaars kunnen deze serverexemplementatieopdrachten gebruiken om foutafhandeling in hun implementaties te valideren. Dit omvat testscenario's zoals apparaatintrekking, interne serverfouten, niet-overeenkomende protocollen en domeingerelateerde uitzonderingen.

Voorbeeld van transactie

Hier volgt een voorbeeld van hoe server-uitzonderingen werken:

Aanvraag-URL:

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

Serverreactie:

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>

Uitzonderingsparameters

Algemene uitzonderingsparameter

Kenmerk Beschrijving Voorbeeld-URL
errorcode:XXXXXXXX Vraag de server om te reageren met een specifieke uitzondering http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0xXXXXXXXX)

Apparaat- en client-uitzonderingen

Apparaatcertificaat ingetrokken

Kenmerk Uitzondering Beschrijving
errorcode:8004C065 DRM_E_DEVCERT_REVOKED Server kan geen licentie leveren aan een ingetrokken clientapparaat

Voorbeeld:

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

Gebruik: Test hoe de client apparaatintrekkingsscenario's verwerkt.

Interne server-uitzonderingen

Interne serverfout

Kenmerk Uitzondering Beschrijving
errorcode:8004C600 DRM_E_SERVER_INTERNAL_ERROR Server genereert een interne server-uitzondering

Voorbeeld:

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

Gebruik: Test clienttolerantie voor interne fouten aan de serverzijde.

Ongeldig bericht

Kenmerk Uitzondering Beschrijving
errorcode:8004C601 DRM_E_SERVER_INVALID_MESSAGE De aanvraag die naar de server is verzonden, is ongeldig

Voorbeeld:

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

Gebruik: Clientafhandeling testen van ongeldige aanvraagreacties.

Protocolversie komt niet overeen

Kenmerk Uitzondering Beschrijving
errorcode:8004C60B DRM_E_SERVER_PROTOCOL_VERSION_MISMATCH De protocolversie die is opgegeven in de aanvraag, wordt niet ondersteund door de server

Voorbeeld:

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

Gebruik: Clientgedrag testen met niet-ondersteunde protocolversies.

Servicespecifieke uitzondering

Kenmerk Uitzondering Beschrijving
errorcode:8004C604 DRM_E_SERVER_SERVICE_SPECIFIC De server genereert een servicespecifieke uitzondering (meestal van de licentie-handler)

Voorbeeld:

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

Gebruik: Clientafhandeling van servicespecifieke fouten testen.

Protocol- en omleidingsonderzondering

Protocolomleiding

Kenmerk Uitzondering Beschrijving
errorcode:8004C60D DRM_E_SERVER_PROTOCOL_REDIRECT Het protocol heeft een omleiding

Voorbeeld:

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

Gebruik: Clientafhandeling van serveromleidingen testen.

Domein vereist

Kenmerk Uitzondering Beschrijving
errorcode:8004C605 DRM_E_SERVER_DOMAIN_REQUIRED De server heeft een standaardlicentieaanvraag ontvangen van de client en vereist dat de client lid wordt van een domein om een domeingebonden licentie te ontvangen

Voorbeeld:

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

Gebruik: Test scenario's voor domeindeelname en bewustzijn van clientdomeinen.

Domein vernieuwen

Kenmerk Uitzondering Beschrijving
errorcode:8004C606 DRM_E_SERVER_RENEW_DOMAIN De server heeft een aanvraag ontvangen van de client met een domeincertificaat, inclusief een verouderde domeinversie. Vereist dat de client het domeincertificaat bijwerkt

Voorbeeld:

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

Gebruik: Test processen voor het vernieuwen van domeincertificaten.

Apparaatlimiet bereikt

Kenmerk Uitzondering Beschrijving
errorcode:8004C602 DRM_E_SERVER_DEVICE_LIMIT_REACHED Server wilde client toevoegen aan een domeinaccount, maar het account heeft al de limiet van het aantal apparaten bereikt

Voorbeeld:

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

Gebruik: Clientafhandeling van domeinapparaatlimieten testen.

Geen domeinlid

Kenmerk Uitzondering Beschrijving
errorcode:8004C60A DRM_E_SERVER_NOT_A_MEMBER De server heeft een geldige licentieaanvraag ontvangen van de client, maar de client is eerder verwijderd uit het domein door de service

Voorbeeld:

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

Gebruik: Test het clientgedrag wanneer deze uit het domein wordt verwijderd.

Onbekende account-id

Kenmerk Uitzondering Beschrijving
errorcode:8004C60C DRM_E_SERVER_UNKNOWN_ACCOUNTID De server heeft een domeingebonden licentieaanvraag ontvangen van de client voor een bepaalde account-id, maar deze id is onbekend voor de service

Voorbeeld:

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

Gebruik: Clientafhandeling van onbekende domeinaccountscenario's testen.

Testscenario's

Eenvoudige uitzonderingstests

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

Test van domeinonderzondering

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

Client robuustheid testen

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

Richtlijnen voor client-implementatie

Best practices voor het afhandelen van uitzonderingen

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

Verwerking van C#-uitzonderingen

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

Validatie en testen

Verwacht gedrag

Wanneer u test met server-uitzonderingen, controleert u of uw client:

  1. Uitzonderingen correct parseren : foutcodes en berichten correct worden geëxtraheerd
  2. Afhandelen probleemloos - Loopt niet vast of loopt vast bij uitzonderingen
  3. Geeft feedback van gebruikers - Geeft de juiste foutberichten aan gebruikers weer
  4. Implementeert logica voor opnieuw proberen : nieuwe pogingen om de juiste fouten met uitstel uit te voeren
  5. Ondersteunt domeinbewerkingen - verwerkt domeingerelateerde uitzonderingen correct

Controlelijst voor testvalidatie

  • [ ] Client identificeert uitzonderingstypen correct
  • [ ] De juiste gebruikersberichten worden weergegeven
  • [ ] Client loopt niet vast bij een uitzonderingstype
  • [ ] Logica voor opnieuw proberen werkt voor herstelbare fouten
  • [ ] Domeindeelname/vernieuwingsprocessen worden correct geactiveerd
  • [ ] Apparaatintrekking wordt veilig afgehandeld
  • [ ] Prestaties blijven acceptabel onder foutvoorwaarden

Beste praktijken

Clientontwikkeling

  1. Uitgebreide foutafhandeling : alle gedocumenteerde uitzonderingstypen verwerken
  2. Gebruikerservaring : duidelijke, bruikbare foutberichten opgeven
  3. Strategie voor opnieuw proberen : de juiste logica voor opnieuw proberen implementeren voor tijdelijke fouten
  4. Beveiliging : ervoor zorgen dat het intrekken van apparaten de toegang tot inhoud voorkomt
  5. Testen - Test alle uitzonderingsscenario's tijdens de ontwikkeling

Foutherstel

  1. Respijtende degradatie - Bewerking voortzetten indien mogelijk
  2. Duidelijke communicatie : gebruikers informeren over problemen en oplossingen
  3. Automatisch herstel - Probeer waar nodig automatische oplossing
  4. Opties voor terugval - Alternatieve inhoud of services bieden
  5. Logboekregistratie - Logboek uitzonderingen voor foutopsporing en analyse

Ondersteuningsbronnen

Zakelijke query's

Bewerkingsquery's

Technische ondersteuning

Trainingsinformatie


© Microsoft Corporation. Alle rechten voorbehouden. Handelsmerken | Privacy