Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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.
eccezioni Domain-Related
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:
- Analizza correttamente le eccezioni : estrae correttamente i codici di errore e i messaggi
- Gestisce normalmente : non si arresta in modo anomalo o si bloccano le eccezioni
- Fornisce commenti e suggerimenti degli utenti: mostra i messaggi di errore appropriati agli utenti
- Implementa la logica di ripetizione dei tentativi : riprovare gli errori appropriati con backoff
- 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
- Gestione degli errori completa - Gestire tutti i tipi di eccezioni documentati
- Esperienza utente - Fornire messaggi di errore chiari e interattivi
- Strategia di ripetizione dei tentativi - Implementare la logica di ripetizione dei tentativi appropriata per gli errori temporanei
- Sicurezza : assicurarsi che la revoca del dispositivo impedisca l'accesso al contenuto
- Test - Testare tutti gli scenari di eccezione durante lo sviluppo
Ripristino degli errori
- Riduzione delle prestazioni normale - Continuare l'operazione quando possibile
- Comunicazione chiara - Informare gli utenti di problemi e soluzioni
- Ripristino automatico - Tentare la risoluzione automatica, se appropriato
- Opzioni di fallback - Fornire contenuti o servizi alternativi
- Registrazione - Registrare le eccezioni per il debug e l'analisi
Documentazione correlata
- Servizio server di test PlayReady - Funzionalità del server di test principale
- Sintassi della stringa di query - Informazioni di riferimento sulla sintassi dei parametri
- Test delle protezioni di output - Test di protezione dell'output
- Server di test PlayReady - Documentazione completa del server
Risorse di supporto
Query aziendali
- Indirizzo di posta elettronica: playready@microsoft.com
Query sulle operazioni
- Sito Web: http://wmlalicensing.com/
- Indirizzo di posta elettronica: ipla@microsoft.com
Supporto tecnico
- Portale di supporto: Supporto tecnico PlayReady
Informazioni di formazione
- Indirizzo di posta elettronica: plyrdyev@microsoft.com
© Microsoft Corporation. Tutti i diritti riservati. Marchi | Privacy