Freigeben über


Testen von Server-Ausnahmen

Überblick

Der PlayReady Test Server enthält spezielle Funktionen, um verschiedene Serverausnahmen programmgesteuert auszulösen. Mit dieser Funktion können Cliententwickler testen, wie ihre Geräte und Anwendungen auf verschiedene Fehlerbedingungen reagieren, die während der Lizenzübernahme in Produktionsumgebungen auftreten können.

Server-Ausnahmetests

Cliententwickler können diese Server-Ausnahmebefehle verwenden, um die Fehlerbehandlung in ihren Implementierungen zu überprüfen. Dies umfasst Testszenarien wie Gerätesperrung, interne Serverfehler, Protokollkonflikte und domänenbezogene Ausnahmen.

Transaktionsbeispiel

Hier ist ein Beispiel für die Funktionsweise von Server exceptions:

Anforderungs-URL:

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

Serverantwort:

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>

Ausnahmeparameter

Generischer Ausnahmeparameter

Parameter BESCHREIBUNG Beispiel-URL
errorcode:XXXXXXXX Anfordern des Servers, mit einer bestimmten Ausnahme zu antworten http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0xXXXXXXXX)

Geräte- und Client-Ausnahmen

Gerätezertifikat widerrufen

Parameter Ausnahme BESCHREIBUNG
errorcode:8004C065 DRM_E_DEVCERT_REVOKED Server kann keine Lizenz an ein widerrufenes Clientgerät übermitteln

Beispiel:

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

Verwendung: Testen Sie, wie der Client Gerätesperrszenarien verarbeitet.

Interne Server-Ausnahmen

Interner Serverfehler

Parameter Ausnahme BESCHREIBUNG
errorcode:8004C600 DRM_E_SERVER_INTERNAL_ERROR Server löst eine interne Server-Ausnahme aus.

Beispiel:

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

Verwendung: Testen der Clientresilienz gegenüber serverseitigen internen Fehlern.

Ungültige Nachricht

Parameter Ausnahme BESCHREIBUNG
errorcode:8004C601 DRM_E_SERVER_INVALID_MESSAGE Die an den Server gesendete Anforderung war ungültig.

Beispiel:

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

Verwendung: Testen der Clientbehandlung von falsch formatierten Anforderungsantworten.

Protokollversionskonflikt

Parameter Ausnahme BESCHREIBUNG
errorcode:8004C60B DRM_E_SERVER_PROTOCOL_VERSION_MISMATCH Die in der Anforderung angegebene Protokollversion wurde vom Server nicht unterstützt.

Beispiel:

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

Verwendung: Testen des Clientverhaltens mit nicht unterstützten Protokollversionen.

Dienstspezifische Ausnahme

Parameter Ausnahme BESCHREIBUNG
errorcode:8004C604 DRM_E_SERVER_SERVICE_SPECIFIC Der Server löst eine dienstspezifische Ausnahme (in der Regel aus dem Lizenzhandler) aus.

Beispiel:

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

Verwendung: Testen sie die Clientbehandlung dienstspezifischer Fehler.

Protokoll- und Umleitungs ausnahmen

Protokollumleitung

Parameter Ausnahme BESCHREIBUNG
errorcode:8004C60D DRM_E_SERVER_PROTOCOL_REDIRECT Das Protokoll verfügt über eine Umleitung

Beispiel:

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

Verwendung: Testen der Clientverarbeitung von Serverumleitungen.

Domäne erforderlich

Parameter Ausnahme BESCHREIBUNG
errorcode:8004C605 DRM_E_SERVER_DOMAIN_REQUIRED Der Server hat eine Standardlizenzanforderung vom Client erhalten und erfordert, dass der Client einer Domäne beitritt, um eine domänengebundene Lizenz zu erhalten.

Beispiel:

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

Verwendung: Testen Der Domänenbeitritt von Szenarien und Clientdomänenbewusstsein.

Domäne verlängern

Parameter Ausnahme BESCHREIBUNG
errorcode:8004C606 DRM_E_SERVER_RENEW_DOMAIN Der Server hat eine Anforderung vom Client mit einem Domänenzertifikat erhalten, einschließlich einer veralteten Domänenversion. Erfordert, dass der Client sein Domänenzertifikat aktualisiert.

Beispiel:

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

Verwendung: Testen von Zertifikaterneuerungsprozessen für Domänen.

Gerätelimit erreicht

Parameter Ausnahme BESCHREIBUNG
errorcode:8004C602 DRM_E_SERVER_DEVICE_LIMIT_REACHED Server war bereit, client zu einem Domänenkonto hinzuzufügen, aber das Konto hat bereits das Limit der Anzahl der Geräte erreicht.

Beispiel:

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

Verwendung: Testen der Clientverarbeitung von Domänengerätebeschränkungen.

Kein Domänenmitglied

Parameter Ausnahme BESCHREIBUNG
errorcode:8004C60A DRM_E_SERVER_NOT_A_MEMBER Der Server hat eine gültige domänengebundene Lizenzanforderung vom Client erhalten, der Client wurde jedoch zuvor von der Domäne nach Dienst entfernt.

Beispiel:

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

Verwendung: Testen sie das Clientverhalten, wenn sie aus der Domäne entfernt werden.

Unbekannte Konto-ID

Parameter Ausnahme BESCHREIBUNG
errorcode:8004C60C DRM_E_SERVER_UNKNOWN_ACCOUNTID Der Server hat eine domänengebundene Lizenzanforderung vom Client für eine bestimmte Konto-ID erhalten, diese ID ist jedoch für den Dienst unbekannt.

Beispiel:

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

Verwendung: Testen sie die Clientbehandlung unbekannter Domänenkontoszenarien.

Testszenarien

Grundlegende Ausnahmetests

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

Domänen exception testing

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

Testen der Client-Robustität

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

Richtlinien für die Clientimplementierung

Bewährte Methoden für die Ausnahmebehandlung

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#-Ausnahmebehandlung

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

Validierung und Tests

Erwartete Verhaltensweisen

Überprüfen Sie beim Testen mit Server exceptions, dass Ihr Client:

  1. Ordnungsgemäß analysiert Ausnahmen - Richtig extrahiert Fehlercodes und Meldungen
  2. Behandelt ordnungsgemäß – stürzt nicht ab oder hängt bei Ausnahmen nicht ab.
  3. Stellt Benutzerfeedback bereit – Zeigt den Benutzern entsprechende Fehlermeldungen an.
  4. Implementiert Wiederholungslogik – Wiederholte Fehler mit Backoff
  5. Unterstützt Domänenvorgänge – Behandelt domänenbezogene Ausnahmen ordnungsgemäß

Prüfliste zur Testüberprüfung

  • [ ] Client identifiziert Ausnahmetypen ordnungsgemäß
  • [ ] Entsprechende Benutzernachrichten werden angezeigt
  • [ ] Client stürzt bei keinem Ausnahmetyp ab
  • [ ] Wiederholungslogik funktioniert für wiederherstellbare Fehler
  • [ ] Domänenbeitritts-/Verlängerungsprozesse werden ordnungsgemäß ausgelöst
  • [ ] Die Gerätesperrung wird sicher behandelt.
  • [ ] Die Leistung bleibt unter Fehlerbedingungen akzeptabel.

Bewährte Methoden

Cliententwicklung

  1. Umfassende Fehlerbehandlung – Behandeln aller dokumentierten Ausnahmetypen
  2. Benutzererfahrung – Bereitstellen klarer, umsetzbarer Fehlermeldungen
  3. Wiederholungsstrategie – Implementieren der geeigneten Wiederholungslogik für vorübergehende Fehler
  4. Sicherheit – Sicherstellen, dass die Gerätesperrung den Zugriff auf Inhalte verhindert
  5. Testen – Testen aller Ausnahmeszenarien während der Entwicklung

Fehlerwiederherstellung

  1. Graceful Degradation - Fortsetzen des Vorgangs nach Möglichkeit
  2. Klare Kommunikation – Informieren der Benutzer über Probleme und Lösungen
  3. Automatische Wiederherstellung – Versuchen Sie bei Bedarf die automatische Auflösung.
  4. Fallbackoptionen – Bereitstellen alternativer Inhalte oder Dienste
  5. Protokollierung – Protokollieren von Ausnahmen für Debugging und Analysen

Supportressourcen

Geschäftsabfragen

Operations-Abfragen

Technischer Support

Schulungsinformationen


© Microsoft Corporation. Alle Rechte vorbehalten. Handelsmarken | Privatsphäre