Partilhar via


Exceções do servidor de teste

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.

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:

  1. Analisa corretamente exceções - extrai corretamente códigos de erro e mensagens
  2. Lida graciosamente - Não trava ou trava exceções
  3. Fornece comentários do usuário - Mostra mensagens de erro apropriadas aos usuários
  4. Implementa a lógica de repetição - Tenta novamente erros apropriados com backoff
  5. 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

  1. Tratamento abrangente de erros - Manipule todos os tipos de exceção documentados
  2. Experiência do usuário - Forneça mensagens de erro claras e acionáveis
  3. Estratégia de repetição - Implementar lógica de repetição apropriada para erros transitórios
  4. Segurança - Garantir que a revogação do dispositivo impeça o acesso ao conteúdo
  5. Teste - Teste todos os cenários de exceção durante o desenvolvimento

Recuperação de erros

  1. Degradação graciosa - Continue a operação quando possível
  2. Comunicação clara - Informar os utilizadores sobre problemas e soluções
  3. Recuperação automática - Tente a resolução automática quando apropriado
  4. Opções de fallback - Fornecer conteúdo ou serviços alternativos
  5. Registro em log - Registrar exceções para depuração e análise

Recursos de suporte

Consultas de negócios

Consultas de operações

Suporte Técnico

Informação de Formação


© Microsoft Corporation. Todos os direitos reservados. Marcas comerciais | Privacidade