Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Visão geral
O PlayReady Test Server inclui funcionalidade especial para acionar programaticamente várias exceções de servidor. Esse recurso permite que os desenvolvedores clientes 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 de servidor
Os desenvolvedores clientes 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 dispositivos, erros internos do servidor, incompatibilidades de protocolo e exceções relacionadas ao domínio.
Exemplo de transação
Veja um exemplo de como as exceções de servidor funcionam:
URL do pedido:
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 | URL de exemplo |
|---|---|---|
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 de dispositivo revogado
| Parâmetro | Exceção | Descrição |
|---|---|---|
errorcode:8004C065 |
DRM_E_DEVCERT_REVOKED |
O servidor não pode entregar uma licença para 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 dispositivos.
Exceções internas do servidor
Erro interno do servidor
| Parâmetro | Exceção | Descrição |
|---|---|---|
errorcode:8004C600 |
DRM_E_SERVER_INTERNAL_ERROR |
O servidor lança uma exceção de servidor interno |
Exemplo:
http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c600)
Uso: Teste a resiliência do cliente a 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 foi suportada pelo servidor |
Exemplo:
http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c60b)
Uso: teste o comportamento do cliente com versões de protocolo não suportadas.
Exceção específica do serviço
| Parâmetro | Exceção | Descrição |
|---|---|---|
errorcode:8004C604 |
DRM_E_SERVER_SERVICE_SPECIFIC |
O servidor lança uma exceção específica do serviço (normalmente do manipulador de licenças) |
Exemplo:
http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c604)
Uso: teste o tratamento de erros específicos do serviço pelo cliente.
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 a manipulação de clientes de redirecionamentos de servidor.
Domain-Related Exceções
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 requer que o cliente ingresse no domínio para receber uma licença vinculada ao domínio |
Exemplo:
http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c605)
Uso: Teste cenários de ingresso de 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 dispositivos 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 do número de dispositivos |
Exemplo:
http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c602)
Uso: teste a manipulação de clientes dos limites de dispositivos de domínio.
Não é um membro do domínio
| Parâmetro | Exceção | Descrição |
|---|---|---|
errorcode:8004C60A |
DRM_E_SERVER_NOT_A_MEMBER |
O servidor recebeu uma solicitação de licença vinculada ao domínio válida do cliente, mas o cliente foi removido anteriormente do domínio pelo 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 de conta desconhecido
| Parâmetro | Exceção | Descrição |
|---|---|---|
errorcode:8004C60C |
DRM_E_SERVER_UNKNOWN_ACCOUNTID |
O servidor recebeu uma solicitação de licença vinculada 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 de clientes de cenários de conta de domínio desconhecido.
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;
}
Testes 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 Testes
Comportamentos esperados
Ao testar com exceções de servidor, valide se seu cliente:
- Analisa corretamente exceções - extrai corretamente códigos de erro e mensagens
- Lida graciosamente - Não trava ou trava exceções
- Fornece comentários do usuário - Mostra mensagens de erro apropriadas aos usuários
- Implementa a lógica de repetição - Tenta novamente erros apropriados com backoff
- Suporta operações de domínio - lida corretamente com exceções relacionadas ao domínio
Lista de verificação de validação de teste
- [ ] O cliente identifica corretamente os tipos de exceção
- [ ] 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 adesão/renovação de domínio são acionados corretamente
- [ ] A revogação do dispositivo é tratada com segurança
- [ ] O desempenho permanece aceitável em condições de erro
Melhores práticas
Desenvolvimento de Clientes
- Tratamento abrangente de erros - Manipule todos os tipos de exceção documentados
- Experiência do usuário - Forneça mensagens de erro claras e acionáveis
- Estratégia de repetição - Implementar 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 - Teste todos os cenários de exceção durante o desenvolvimento
Recuperação de erros
- Degradação graciosa - Continue a operação quando possível
- Comunicação clara - Informar os utilizadores sobre problemas e soluções
- Recuperação automática - Tente a resolução automática quando apropriado
- Opções de fallback - Fornecer conteúdo ou serviços alternativos
- Registro em log - Registrar exceções para depuração e análise
Documentação relacionada
- Serviço de Servidor de Teste PlayReady - Funcionalidade principal do servidor de teste
- Sintaxe da Cadeia de Caracteres de Consulta - Referência de sintaxe de parâmetro
- Teste de proteções de saída - Teste de proteção de saída
- PlayReady Test Servers - Documentação completa do servidor
Recursos de suporte
Consultas de negócios
- E-mail: playready@microsoft.com
Consultas de operações
- Sítio Internet: http://wmlalicensing.com/
- E-mail: ipla@microsoft.com
Suporte Técnico
- Portal de suporte: Suporte técnico PlayReady
Informação de Formação
- E-mail: plyrdyev@microsoft.com
© Microsoft Corporation. Todos os direitos reservados. Marcas comerciais | Privacidade