Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Обзор
Сервер тестирования 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)
Использование: тестирование обработки клиентских перенаправлений сервера.
исключения Domain-Related
Обязательный домен
| Параметр | Исключение | Описание |
|---|---|---|
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;
}
}
Проверка и тестирование
Ожидаемое поведение
При тестировании с исключениями сервера убедитесь, что клиент:
- Правильный анализ исключений . Правильно извлекает коды ошибок и сообщения
- Обрабатывается корректно . Не завершает работу или не зависает на исключениях
- Предоставление отзывов пользователей . Отображаются соответствующие сообщения об ошибках для пользователей
- Реализует логику повторных попыток . Повторите соответствующие ошибки с обратным выходом
- Поддерживает операции домена . Правильно обрабатывает исключения, связанные с доменом.
Контрольный список проверки проверки
- [ ] Клиент правильно определяет типы исключений
- [ ] Отображаются соответствующие сообщения пользователей
- [ ] Клиент не завершает работу в любом типе исключения
- [ ] Логика повторных попыток работает для восстанавливаемых ошибок
- [ ] Процессы присоединения к домену и продления активируются правильно
- [ ] Отзыв устройства обрабатывается безопасно
- [ ] Производительность остается приемлемой в условиях ошибки
Лучшие практики
Развитие клиентских отношений
- Комплексная обработка ошибок . Обработка всех документированных типов исключений
- Взаимодействие с пользователем . Предоставление четких, интерактивных сообщений об ошибках
- Стратегия повторных попыток . Реализация соответствующей логики повторных попыток для временных ошибок
- Безопасность . Убедитесь, что отзыв устройства предотвращает доступ к содержимому
- Тестирование — тестирование всех сценариев исключений во время разработки
Устранение ошибок
- Грациозная деградация — продолжить операцию, когда это возможно
- Очистка коммуникации — информирование пользователей о проблемах и решениях
- Автоматическое восстановление — попытка автоматического разрешения при необходимости
- Резервные параметры — предоставление альтернативного содержимого или служб
- Ведение журнала — исключения журналов для отладки и аналитики
Сопутствующая документация
- Служба тестового сервера PlayReady — функции основного тестового сервера
- Синтаксис строки запроса — справочник по синтаксису параметров
- Тестирование выходных данных — тестирование защиты выходных данных
- Тестовые серверы PlayReady — полная документация по серверу
Ресурсы поддержки
Бизнес-запросы
- Электронная почта: playready@microsoft.com
Запросы операций
- Веб-сайт : http://wmlalicensing.com/
- Электронная почта: ipla@microsoft.com
Техническая поддержка
- Портал поддержки: техническая поддержка PlayReady
Сведения об обучении
- Электронная почта: plyrdyev@microsoft.com
© Корпорация Майкрософт. Все права защищены. Товарные знаки | Конфиденциальность