Поделиться через


Тестирование исключений сервера

Обзор

Сервер тестирования PlayReady включает специальные функции для программного активации различных исключений сервера. Эта возможность позволяет разработчикам клиентов проверить, как их устройства и приложения реагируют на различные условия ошибки, которые могут возникать во время приобретения лицензий в рабочих средах.

Тестирование исключений сервера

Разработчики клиентов могут использовать эти команды исключений сервера для проверки обработки ошибок в реализации. Это включает в себя сценарии тестирования, такие как отзыв устройств, внутренние ошибки сервера, несоответствия протокола и исключения, связанные с доменом.

Пример транзакции

Ниже приведен пример работы исключений сервера.

URL-адрес запроса:

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

Ответ сервера:

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>

Параметры исключения

Универсальный параметр исключения

Параметр Описание Пример URL-адреса
errorcode:XXXXXXXX Запрос сервера на реагирование с определенным исключением http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0xXXXXXXXX)

Исключения устройств и клиентов

Отзыв сертификата устройства

Параметр Исключение Описание
errorcode:8004C065 DRM_E_DEVCERT_REVOKED Сервер не может доставлять лицензию на отозванное клиентское устройство

Пример:

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

Использование. Проверка того, как клиент обрабатывает сценарии отзыва устройств.

Внутренние исключения сервера

Внутренняя ошибка сервера

Параметр Исключение Описание
errorcode:8004C600 DRM_E_SERVER_INTERNAL_ERROR Сервер создает исключение внутреннего сервера

Пример:

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

Использование: проверка устойчивости клиента к внутренним ошибкам на стороне сервера.

Недопустимое сообщение

Параметр Исключение Описание
errorcode:8004C601 DRM_E_SERVER_INVALID_MESSAGE Запрос, отправленный серверу, был недопустим

Пример:

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

Использование: тестирование обработки клиентов неправильно сформированных ответов на запросы.

Несоответствие версии протокола

Параметр Исключение Описание
errorcode:8004C60B DRM_E_SERVER_PROTOCOL_VERSION_MISMATCH Версия протокола, указанная в запросе, не поддерживается сервером.

Пример:

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

Использование: тестирование поведения клиента с неподдерживаемых версий протокола.

Исключение для конкретной службы

Параметр Исключение Описание
errorcode:8004C604 DRM_E_SERVER_SERVICE_SPECIFIC Сервер выдает определенное исключение службы (обычно из обработчика лицензий)

Пример:

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

Использование: тестирование обработки клиентом ошибок, относящихся к службе.

Исключения протокола и перенаправления

Перенаправление протокола

Параметр Исключение Описание
errorcode:8004C60D DRM_E_SERVER_PROTOCOL_REDIRECT Протокол имеет перенаправление

Пример:

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

Использование: тестирование обработки клиентских перенаправлений сервера.

Обязательный домен

Параметр Исключение Описание
errorcode:8004C605 DRM_E_SERVER_DOMAIN_REQUIRED Сервер получил стандартный запрос лицензии от клиента и требует от клиента присоединиться к домену, чтобы получить лицензию на привязку к домену.

Пример:

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

Использование: тестирование сценариев присоединения к домену и осведомленности о домене клиента.

Продление домена

Параметр Исключение Описание
errorcode:8004C606 DRM_E_SERVER_RENEW_DOMAIN Сервер получил запрос от клиента с сертификатом домена, включая устаревшую версию домена. Требуется, чтобы клиент обновил свой сертификат домена

Пример:

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

Использование: тестирование процессов продления сертификата домена.

Достигнуто ограничение устройства

Параметр Исключение Описание
errorcode:8004C602 DRM_E_SERVER_DEVICE_LIMIT_REACHED Сервер был готов добавить клиента в учетную запись домена, но учетная запись уже достигла предела количества устройств.

Пример:

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

Использование. Тестирование обработки клиентских ограничений на устройство домена.

Не член домена

Параметр Исключение Описание
errorcode:8004C60A DRM_E_SERVER_NOT_A_MEMBER Сервер получил действительный запрос лицензии на привязку домена от клиента, но клиент ранее был удален из домена по службе

Пример:

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

Использование: тестирование поведения клиента при удалении из домена.

Неизвестный идентификатор учетной записи

Параметр Исключение Описание
errorcode:8004C60C DRM_E_SERVER_UNKNOWN_ACCOUNTID Сервер получил запрос лицензии на привязку домена от клиента для определенного идентификатора учетной записи, но этот идентификатор неизвестен службе.

Пример:

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

Использование: тестирование обработки клиентов неизвестных сценариев учетной записи домена.

Сценарии тестирования

Базовое тестирование исключений

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

Тестирование исключений домена

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

Тестирование надежности клиента

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

Рекомендации по реализации клиента

Рекомендации по обработке исключений

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#

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

Проверка и тестирование

Ожидаемое поведение

При тестировании с исключениями сервера убедитесь, что клиент:

  1. Правильный анализ исключений . Правильно извлекает коды ошибок и сообщения
  2. Обрабатывается корректно . Не завершает работу или не зависает на исключениях
  3. Предоставление отзывов пользователей . Отображаются соответствующие сообщения об ошибках для пользователей
  4. Реализует логику повторных попыток . Повторите соответствующие ошибки с обратным выходом
  5. Поддерживает операции домена . Правильно обрабатывает исключения, связанные с доменом.

Контрольный список проверки проверки

  • [ ] Клиент правильно определяет типы исключений
  • [ ] Отображаются соответствующие сообщения пользователей
  • [ ] Клиент не завершает работу в любом типе исключения
  • [ ] Логика повторных попыток работает для восстанавливаемых ошибок
  • [ ] Процессы присоединения к домену и продления активируются правильно
  • [ ] Отзыв устройства обрабатывается безопасно
  • [ ] Производительность остается приемлемой в условиях ошибки

Лучшие практики

Развитие клиентских отношений

  1. Комплексная обработка ошибок . Обработка всех документированных типов исключений
  2. Взаимодействие с пользователем . Предоставление четких, интерактивных сообщений об ошибках
  3. Стратегия повторных попыток . Реализация соответствующей логики повторных попыток для временных ошибок
  4. Безопасность . Убедитесь, что отзыв устройства предотвращает доступ к содержимому
  5. Тестирование — тестирование всех сценариев исключений во время разработки

Устранение ошибок

  1. Грациозная деградация — продолжить операцию, когда это возможно
  2. Очистка коммуникации — информирование пользователей о проблемах и решениях
  3. Автоматическое восстановление — попытка автоматического разрешения при необходимости
  4. Резервные параметры — предоставление альтернативного содержимого или служб
  5. Ведение журнала — исключения журналов для отладки и аналитики

Ресурсы поддержки

Бизнес-запросы

Запросы операций

Техническая поддержка

Сведения об обучении


© Корпорация Майкрософт. Все права защищены. Товарные знаки | Конфиденциальность