Condividi tramite


Test delle eccezioni del server

Informazioni generali

Il server di test PlayReady include funzionalità speciali per attivare a livello di codice varie eccezioni del server. Questa funzionalità consente agli sviluppatori client di testare il modo in cui i dispositivi e le applicazioni rispondono a diverse condizioni di errore che possono verificarsi durante l'acquisizione delle licenze negli ambienti di produzione.

Test delle eccezioni del server

Gli sviluppatori client possono usare questi comandi di eccezione del server per convalidare la gestione degli errori nelle implementazioni. Sono inclusi scenari di test, ad esempio la revoca dei dispositivi, gli errori interni del server, le mancate corrispondenze del protocollo e le eccezioni correlate al dominio.

Esempio di transazione

Ecco un esempio del funzionamento delle eccezioni del server:

URL richiesta:

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

Risposta del server:

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>

Parametri di eccezione

Parametro eccezione generico

Parametro Descrizione URL di esempio
errorcode:XXXXXXXX Richiedere al server di rispondere con un'eccezione specifica http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0xXXXXXXXX)

Eccezioni del dispositivo e del client

Certificato dispositivo revocato

Parametro Eccezione Descrizione
errorcode:8004C065 DRM_E_DEVCERT_REVOKED Il server non può recapitare una licenza a un dispositivo client revocato

Esempio:

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

Utilizzo: testare il modo in cui il client gestisce gli scenari di revoca dei dispositivi.

Eccezioni interne del server

Errore interno del server

Parametro Eccezione Descrizione
errorcode:8004C600 DRM_E_SERVER_INTERNAL_ERROR Il server genera un'eccezione interna del server

Esempio:

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

Utilizzo: testare la resilienza del client per gli errori interni lato server.

Messaggio non valido

Parametro Eccezione Descrizione
errorcode:8004C601 DRM_E_SERVER_INVALID_MESSAGE La richiesta inviata al server non è valida

Esempio:

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

Utilizzo: testare la gestione client delle risposte alle richieste in formato non valido.

Mancata corrispondenza della versione del protocollo

Parametro Eccezione Descrizione
errorcode:8004C60B DRM_E_SERVER_PROTOCOL_VERSION_MISMATCH La versione del protocollo specificata nella richiesta non è supportata dal server

Esempio:

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

Utilizzo: testare il comportamento del client con versioni del protocollo non supportate.

Eccezione specifica del servizio

Parametro Eccezione Descrizione
errorcode:8004C604 DRM_E_SERVER_SERVICE_SPECIFIC Il server genera un'eccezione specifica del servizio (in genere dal gestore licenze)

Esempio:

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

Utilizzo: testare la gestione client di errori specifici del servizio.

Eccezioni di protocollo e reindirizzamento

Reindirizzamento protocollo

Parametro Eccezione Descrizione
errorcode:8004C60D DRM_E_SERVER_PROTOCOL_REDIRECT Il protocollo ha un reindirizzamento

Esempio:

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

Utilizzo: testare la gestione client dei reindirizzamenti del server.

Dominio obbligatorio

Parametro Eccezione Descrizione
errorcode:8004C605 DRM_E_SERVER_DOMAIN_REQUIRED Il server ha ricevuto una richiesta di licenza standard dal client e richiede al client di aggiungere un dominio per ricevere una licenza associata a un dominio

Esempio:

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

Utilizzo: testare gli scenari di aggiunta a un dominio e la consapevolezza del dominio client.

Rinnovare il dominio

Parametro Eccezione Descrizione
errorcode:8004C606 DRM_E_SERVER_RENEW_DOMAIN Il server ha ricevuto una richiesta dal client con un certificato di dominio, inclusa una versione di dominio obsoleta. Richiede al client di aggiornare il certificato di dominio

Esempio:

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

Utilizzo: processi di rinnovo del certificato di dominio di test.

Limite di dispositivi raggiunto

Parametro Eccezione Descrizione
errorcode:8004C602 DRM_E_SERVER_DEVICE_LIMIT_REACHED Il server era disposto ad aggiungere client a un account di dominio, ma l'account ha già raggiunto il limite di numero di dispositivi

Esempio:

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

Utilizzo: testare la gestione client dei limiti dei dispositivi di dominio.

Non un membro di dominio

Parametro Eccezione Descrizione
errorcode:8004C60A DRM_E_SERVER_NOT_A_MEMBER Il server ha ricevuto una richiesta di licenza valida associata a un dominio dal client, ma il client è stato precedentemente rimosso dal dominio dal servizio

Esempio:

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

Utilizzo: testare il comportamento del client quando viene rimosso dal dominio.

ID account sconosciuto

Parametro Eccezione Descrizione
errorcode:8004C60C DRM_E_SERVER_UNKNOWN_ACCOUNTID Il server ha ricevuto una richiesta di licenza associata a un dominio dal client per un determinato ID account, ma questo ID è sconosciuto al servizio

Esempio:

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

Utilizzo: testare la gestione client di scenari di account di dominio sconosciuti.

Scenari di test

Test di base delle eccezioni

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 delle eccezioni di dominio

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

Test di affidabilità dei client

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

Linee guida per l'implementazione client

Procedure consigliate per la gestione delle eccezioni

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

Gestione delle eccezioni 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;
    }
}

Convalida e test

Comportamenti previsti

Quando si esegue il test con eccezioni del server, verificare che il client:

  1. Analizza correttamente le eccezioni : estrae correttamente i codici di errore e i messaggi
  2. Gestisce normalmente : non si arresta in modo anomalo o si bloccano le eccezioni
  3. Fornisce commenti e suggerimenti degli utenti: mostra i messaggi di errore appropriati agli utenti
  4. Implementa la logica di ripetizione dei tentativi : riprovare gli errori appropriati con backoff
  5. Supporta le operazioni di dominio : gestisce correttamente le eccezioni correlate al dominio

Elenco di controllo per la convalida dei test

  • [ ] Il client identifica correttamente i tipi di eccezione
  • [ ] Vengono visualizzati i messaggi utente appropriati
  • [ ] Il client non si arresta in modo anomalo in alcun tipo di eccezione
  • [ ] La logica di ripetizione dei tentativi funziona per gli errori ripristinabili
  • [ ] I processi di aggiunta/rinnovo del dominio vengono attivati correttamente
  • [ ] La revoca del dispositivo viene gestita in modo sicuro
  • [ ] Le prestazioni rimangono accettabili in condizioni di errore

Migliori pratiche

Sviluppo di client

  1. Gestione degli errori completa - Gestire tutti i tipi di eccezioni documentati
  2. Esperienza utente - Fornire messaggi di errore chiari e interattivi
  3. Strategia di ripetizione dei tentativi - Implementare la logica di ripetizione dei tentativi appropriata per gli errori temporanei
  4. Sicurezza : assicurarsi che la revoca del dispositivo impedisca l'accesso al contenuto
  5. Test - Testare tutti gli scenari di eccezione durante lo sviluppo

Ripristino degli errori

  1. Riduzione delle prestazioni normale - Continuare l'operazione quando possibile
  2. Comunicazione chiara - Informare gli utenti di problemi e soluzioni
  3. Ripristino automatico - Tentare la risoluzione automatica, se appropriato
  4. Opzioni di fallback - Fornire contenuti o servizi alternativi
  5. Registrazione - Registrare le eccezioni per il debug e l'analisi

Risorse di supporto

Query aziendali

Query sulle operazioni

Supporto tecnico

Informazioni di formazione


© Microsoft Corporation. Tutti i diritti riservati. Marchi | Privacy