Aracılığıyla paylaş


Sunucu Özel Durumlarını Test Etme

Genel Bakış

PlayReady Test Sunucusu, çeşitli sunucu özel durumlarını program aracılığıyla tetikleyen özel işlevler içerir. Bu özellik, istemci geliştiricilerin cihazlarının ve uygulamalarının üretim ortamlarında lisans alma sırasında oluşabilecek farklı hata koşullarına nasıl yanıt verdiğini test etmesine olanak tanır.

Sunucu Özel Durum Testi

İstemci geliştiriciler, uygulamalarında hata işlemeyi doğrulamak için bu sunucu özel durum komutlarını kullanabilir. Buna cihaz iptali, iç sunucu hataları, protokol uyuşmazlıkları ve etki alanıyla ilgili özel durumlar gibi test senaryoları dahildir.

İşlem Örneği

Sunucu özel durumlarının nasıl çalıştığını gösteren bir örnek aşağıda verilmiştir:

İstek URL'si:

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

Sunucu Yanıtı:

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>

Özel Durum Parametreleri

Genel Özel Durum Parametresi

Parametre Açıklama Örnek URL
errorcode:XXXXXXXX Sunucudan belirli bir özel durumla yanıt vermesini isteme http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0xXXXXXXXX)

Cihaz ve İstemci Özel Durumları

Cihaz Sertifikası İptal Edilmiş

Parametre İstisna Açıklama
errorcode:8004C065 DRM_E_DEVCERT_REVOKED Sunucu, iptal edilmiş bir istemci cihazına lisans teslim edemiyor

Örnek:

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

Kullanım: İstemcinin cihaz iptal senaryolarını nasıl işlediğini test edin.

Sunucu İç Özel Durumları

İç Sunucu Hatası

Parametre İstisna Açıklama
errorcode:8004C600 DRM_E_SERVER_INTERNAL_ERROR Sunucu bir iç sunucu özel durumu oluşturur

Örnek:

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

Kullanım: İstemci dayanıklılığını sunucu tarafı iç hatalarına karşı test edin.

Geçersiz İleti

Parametre İstisna Açıklama
errorcode:8004C601 DRM_E_SERVER_INVALID_MESSAGE Sunucuya gönderilen istek geçersiz

Örnek:

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

Kullanım: Hatalı biçimlendirilmiş istek yanıtlarının istemci işlemesini test edin.

Protokol Sürümü Uyuşmazlığı

Parametre İstisna Açıklama
errorcode:8004C60B DRM_E_SERVER_PROTOCOL_VERSION_MISMATCH İstekte belirtilen protokol sürümü sunucu tarafından desteklenmiyor

Örnek:

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

Kullanım: Desteklenmeyen protokol sürümleriyle istemci davranışını test edin.

Hizmete Özgü Özel Durum

Parametre İstisna Açıklama
errorcode:8004C604 DRM_E_SERVER_SERVICE_SPECIFIC Sunucu hizmete özgü bir özel durum oluşturur (genellikle lisans işleyicisinden)

Örnek:

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

Kullanım: Hizmete özgü hataların istemci işlemesini test edin.

Protokol ve Yeniden Yönlendirme Özel Durumları

Protokol Yeniden Yönlendirme

Parametre İstisna Açıklama
errorcode:8004C60D DRM_E_SERVER_PROTOCOL_REDIRECT Protokolün yeniden yönlendirmesi var

Örnek:

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

Kullanım: Sunucu yeniden yönlendirmelerinin istemci işlemesini test edin.

Etki Alanı Gerekli

Parametre İstisna Açıklama
errorcode:8004C605 DRM_E_SERVER_DOMAIN_REQUIRED Sunucu istemciden standart bir lisans isteği aldı ve etki alanına bağlı bir lisans almak için istemcinin etki alanına katılmasını gerektiriyor

Örnek:

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

Kullanım: Etki alanına katılma senaryolarını ve istemci etki alanı tanımayı test edin.

Etki Alanını Yenile

Parametre İstisna Açıklama
errorcode:8004C606 DRM_E_SERVER_RENEW_DOMAIN Sunucu, eski bir etki alanı sürümü de dahil olmak üzere bir etki alanı sertifikasına sahip istemciden bir istek aldı. İstemcinin etki alanı sertifikasını güncelleştirmesini gerektirir

Örnek:

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

Kullanım: Etki alanı sertifikası yenileme işlemlerini test edin.

Cihaz Sınırına Ulaşıldı

Parametre İstisna Açıklama
errorcode:8004C602 DRM_E_SERVER_DEVICE_LIMIT_REACHED Sunucu bir etki alanı hesabına istemci eklemeye istekliydi, ancak hesap zaten cihaz sayısı sınırına ulaştı

Örnek:

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

Kullanım: Etki alanı cihaz sınırlarının istemci işlemesini test edin.

Etki Alanı Üyesi Değil

Parametre İstisna Açıklama
errorcode:8004C60A DRM_E_SERVER_NOT_A_MEMBER Sunucu istemciden geçerli bir etki alanına bağlı lisans isteği aldı, ancak istemci daha önce hizmet tarafından etki alanından kaldırılmıştı

Örnek:

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

Kullanım: Etki alanından kaldırıldığında istemci davranışını test edin.

Bilinmeyen Hesap Kimliği

Parametre İstisna Açıklama
errorcode:8004C60C DRM_E_SERVER_UNKNOWN_ACCOUNTID Sunucu belirli bir hesap kimliği için istemciden etki alanına bağlı lisans isteği aldı, ancak bu kimlik hizmet tarafından bilinmiyor

Örnek:

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

Kullanım: Bilinmeyen etki alanı hesabı senaryolarının istemci işlemesini test edin.

Test Senaryoları

Temel Özel Durum Testi

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

Etki Alanı Özel Durum Testi

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

İstemci Sağlamlığı Testi

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

İstemci Uygulama Yönergeleri

Özel Durum İşleme en iyi yöntemleri

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# Özel Durum İşleme

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

Doğrulama ve Test Etme

Beklenen Davranışlar

Sunucu özel durumlarıyla test ederken, istemcinizin şunları doğrulayın:

  1. Özel Durumları Düzgün Ayrıştırıyor - Hata kodlarını ve iletileri doğru ayıklar
  2. Düzgün bir şekilde işler - Kilitlenmez veya özel durumlarda yanıt vermez
  3. Kullanıcı Geri Bildirimi sağlar - Kullanıcılara uygun hata iletilerini gösterir
  4. Yeniden Deneme Mantığını Uygular - Geri alma ile uygun hataları yeniden dener
  5. Etki Alanı İşlemlerini Destekler - Etki alanıyla ilgili özel durumları doğru işler

Test Doğrulama Denetim Listesi

  • [ ] İstemci özel durum türlerini doğru şekilde tanımlar
  • [ ] Uygun kullanıcı iletileri görüntüleniyor
  • [ ] İstemci hiçbir özel durum türünde kilitlenmez
  • [ ] Yeniden deneme mantığı kurtarılabilir hatalar için çalışır
  • [ ] Etki alanına katılma/yenileme işlemleri doğru tetikleniyor
  • [ ] Cihaz iptali güvenli bir şekilde işlenir
  • [ ] Performans, hata koşulları altında kabul edilebilir olmaya devam eder

En İyi Yöntemler

Müşteri Geliştirme

  1. Kapsamlı Hata İşleme - Belgelenen tüm özel durum türlerini işleme
  2. Kullanıcı Deneyimi - Net, eyleme dönüştürülebilir hata iletileri sağlayın
  3. Yeniden Deneme Stratejisi - Geçici hatalar için uygun yeniden deneme mantığını uygulama
  4. Güvenlik - Cihazın iptal edilmesinin içerik erişimini engellediğinden emin olun
  5. Test - Geliştirme sırasında tüm özel durum senaryolarını test etme

Hata Kurtarma

  1. Düzgün Performans Düşüşü - Mümkün olduğunda işleme devam et
  2. İletişimi Temizle - Sorunları ve çözümleri kullanıcılara bildirme
  3. Otomatik Kurtarma - Uygun yerlerde otomatik çözümlemeyi deneme
  4. Geri Dönüş Seçenekleri - Alternatif içerik veya hizmetler sağlama
  5. Günlüğe kaydetme - Hata ayıklama ve analiz için günlük özel durumları

Destek Kaynakları

İş Sorguları

İşlem Sorguları

Teknik Destek

Eğitim Bilgileri


© Microsoft Corporation. Tüm hakları saklıdır. Ticari markalarıdır | Gizlilik