Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Visão geral
O Servidor de Teste do PlayReady inclui funcionalidade especial para disparar programaticamente várias exceções de servidor. Essa funcionalidade permite que os desenvolvedores cliente testem como seus dispositivos e aplicativos respondem a diferentes condições de erro que podem ocorrer durante a aquisição de licenças em ambientes de produção.
Teste de exceção do servidor
Os desenvolvedores cliente podem usar esses comandos de exceção de servidor para validar o tratamento de erros em suas implementações. Isso inclui cenários de teste, como revogação de dispositivo, erros internos do servidor, incompatibilidades de protocolo e exceções relacionadas ao domínio.
Exemplo de transação
Veja um exemplo de como funcionam as exceções de servidor:
URL de solicitação:
http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c065)
Resposta do servidor:
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>
Parâmetros de exceção
Parâmetro de exceção genérico
| Parâmetro | Descrição | Exemplo de URL |
|---|---|---|
errorcode:XXXXXXXX |
Solicitar que o servidor responda com uma exceção específica | http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0xXXXXXXXX) |
Exceções de dispositivo e cliente
Certificado do dispositivo revogado
| Parâmetro | Exceção | Descrição |
|---|---|---|
errorcode:8004C065 |
DRM_E_DEVCERT_REVOKED |
O servidor não pode entregar uma licença a um dispositivo cliente revogado |
Exemplo:
http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c065)
Uso: teste como o cliente lida com cenários de revogação de dispositivo.
Exceções internas do servidor
Erro interno do servidor
| Parâmetro | Exceção | Descrição |
|---|---|---|
errorcode:8004C600 |
DRM_E_SERVER_INTERNAL_ERROR |
O servidor gera uma exceção interna do servidor |
Exemplo:
http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c600)
Uso: teste a resiliência do cliente para erros internos do lado do servidor.
Mensagem inválida
| Parâmetro | Exceção | Descrição |
|---|---|---|
errorcode:8004C601 |
DRM_E_SERVER_INVALID_MESSAGE |
A solicitação enviada ao servidor era inválida |
Exemplo:
http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c601)
Uso: teste o tratamento do cliente de respostas de solicitação malformadas.
Incompatibilidade de versão do protocolo
| Parâmetro | Exceção | Descrição |
|---|---|---|
errorcode:8004C60B |
DRM_E_SERVER_PROTOCOL_VERSION_MISMATCH |
A versão do protocolo especificada na solicitação não era compatível com o servidor |
Exemplo:
http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c60b)
Uso: teste o comportamento do cliente com versões de protocolo sem suporte.
Exceção específica do serviço
| Parâmetro | Exceção | Descrição |
|---|---|---|
errorcode:8004C604 |
DRM_E_SERVER_SERVICE_SPECIFIC |
O servidor gera uma exceção específica do serviço (normalmente do manipulador de licença) |
Exemplo:
http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c604)
Uso: teste o tratamento do cliente de erros específicos do serviço.
Exceções de protocolo e redirecionamento
Redirecionamento de protocolo
| Parâmetro | Exceção | Descrição |
|---|---|---|
errorcode:8004C60D |
DRM_E_SERVER_PROTOCOL_REDIRECT |
O protocolo tem um redirecionamento |
Exemplo:
http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c60d)
Uso: teste o tratamento do cliente de redirecionamentos de servidor.
Exceções de Domain-Related
Domínio necessário
| Parâmetro | Exceção | Descrição |
|---|---|---|
errorcode:8004C605 |
DRM_E_SERVER_DOMAIN_REQUIRED |
O servidor recebeu uma solicitação de licença padrão do cliente e exige que o cliente ingresse no domínio para receber uma licença associada ao domínio |
Exemplo:
http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c605)
Uso: testar cenários de ingresso no domínio e reconhecimento de domínio do cliente.
Renovar Domínio
| Parâmetro | Exceção | Descrição |
|---|---|---|
errorcode:8004C606 |
DRM_E_SERVER_RENEW_DOMAIN |
O servidor recebeu uma solicitação do cliente com um certificado de domínio, incluindo uma versão de domínio desatualizada. Requer que o cliente atualize seu certificado de domínio |
Exemplo:
http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c606)
Uso: testar processos de renovação de certificado de domínio.
Limite de dispositivo atingido
| Parâmetro | Exceção | Descrição |
|---|---|---|
errorcode:8004C602 |
DRM_E_SERVER_DEVICE_LIMIT_REACHED |
O servidor estava disposto a adicionar o cliente a uma conta de domínio, mas a conta já atingiu o limite de número de dispositivos |
Exemplo:
http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c602)
Uso: teste o tratamento do cliente dos limites do dispositivo de domínio.
Não é um membro de domínio
| Parâmetro | Exceção | Descrição |
|---|---|---|
errorcode:8004C60A |
DRM_E_SERVER_NOT_A_MEMBER |
O servidor recebeu uma solicitação válida de licença associada ao domínio do cliente, mas o cliente foi removido anteriormente do domínio por serviço |
Exemplo:
http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c60a)
Uso: teste o comportamento do cliente quando removido do domínio.
ID da conta desconhecida
| Parâmetro | Exceção | Descrição |
|---|---|---|
errorcode:8004C60C |
DRM_E_SERVER_UNKNOWN_ACCOUNTID |
O servidor recebeu uma solicitação de licença associada ao domínio do cliente para uma determinada ID de conta, mas essa ID é desconhecida para o serviço |
Exemplo:
http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c60c)
Uso: teste o tratamento do cliente de cenários de conta de domínio desconhecidos.
Cenários de teste
Teste básico de exceção
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;
}
Teste de exceção de domínio
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;
}
Teste de robustez do cliente
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
}))
};
}
Diretrizes de implementação do cliente
Práticas recomendadas de tratamento de exceções
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);
}
}
Tratamento de exceções em 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;
}
}
Validação e teste
Comportamentos esperados
Ao testar com exceções de servidor, valide se o cliente:
- Analisa corretamente exceções – extrai corretamente códigos de erro e mensagens
- Manipula normalmente - Não trava ou trava em exceções
- Fornece Comentários do Usuário – Mostra as mensagens de erro apropriadas aos usuários
- Implementa a lógica de repetição – repete os erros apropriados com a retirada
- Dá suporte a operações de domínio – manipula as exceções relacionadas ao domínio corretamente
Lista de verificação de validação de teste
- [ ] O cliente identifica corretamente os tipos de exceção
- [ ] As mensagens de usuário apropriadas são exibidas
- [ ] O cliente não falha em nenhum tipo de exceção
- [ ] A lógica de repetição funciona para erros recuperáveis
- [ ] Os processos de ingressamento/renovação de domínio são disparados corretamente
- [ ] A revogação do dispositivo é tratada com segurança
- [ ] O desempenho permanece aceitável em condições de erro
Práticas recomendadas
Desenvolvimento do cliente
- Tratamento abrangente de erros – lidar com todos os tipos de exceção documentados
- Experiência do Usuário – Fornecer mensagens de erro claras e acionáveis
- Estratégia de repetição – implementar a lógica de repetição apropriada para erros transitórios
- Segurança – Garantir que a revogação do dispositivo impeça o acesso ao conteúdo
- Teste – Testar todos os cenários de exceção durante o desenvolvimento
Recuperação de erro
- Degradação Normal – Continuar a operação quando possível
- Comunicação Clara – Informar os usuários sobre problemas e soluções
- Recuperação Automática – Tentar resolução automática quando apropriado
- Opções de fallback – fornecer conteúdo ou serviços alternativos
- Log – Exceções de log para depuração e análise
Documentação relacionada
- Serviço de Servidor de Teste do PlayReady – Funcionalidade principal do servidor de teste
- Sintaxe da cadeia de caracteres de consulta – referência de sintaxe de parâmetro
- Testando proteções de saída – teste de proteção de saída
- Servidores de Teste do PlayReady – Documentação completa do servidor
Recursos de suporte
Consultas comerciais
- Email: playready@microsoft.com
Consultas de operações
- Site: http://wmlalicensing.com/
- Email: ipla@microsoft.com
Suporte técnico
- Portal de Suporte: Suporte Técnico do PlayReady
Informações de treinamento
- Email: plyrdyev@microsoft.com
© Microsoft Corporation. Todos os direitos reservados. Marcas comerciais | Privacidade