Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Przegląd
Serwer Test PlayReady zawiera specjalne funkcje programowe wyzwalania różnych wyjątków serwera. Ta funkcja umożliwia deweloperom klientów testowanie sposobu reagowania ich urządzeń i aplikacji na różne warunki błędów, które mogą wystąpić podczas pozyskiwania licencji w środowiskach produkcyjnych.
Testowanie wyjątków serwera
Deweloperzy klienta mogą używać tych poleceń wyjątków serwera do weryfikowania obsługi błędów w ich implementacjach. Obejmuje to scenariusze testowania, takie jak odwołanie urządzenia, wewnętrzne błędy serwera, niezgodności protokołu i wyjątki związane z domeną.
Przykład transakcji
Oto przykład działania wyjątków serwera:
Adres URL żądania:
http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c065)
Odpowiedź serwera:
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>
Parametry wyjątku
Ogólny parametr wyjątku
| Parametr | Opis | Przykładowy adres URL |
|---|---|---|
errorcode:XXXXXXXX |
Zażądaj odpowiedzi serwera z określonym wyjątkiem | http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0xXXXXXXXX) |
Wyjątki urządzeń i klientów
Certyfikat urządzenia został odwołany
| Parametr | Wyjątek | Opis |
|---|---|---|
errorcode:8004C065 |
DRM_E_DEVCERT_REVOKED |
Serwer nie może dostarczyć licencji na odwołane urządzenie klienckie |
Przykład:
http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c065)
Użycie: przetestuj sposób obsługi scenariuszy odwoływania urządzeń przez klienta.
Wyjątki wewnętrzne serwera
Wewnętrzny błąd serwera
| Parametr | Wyjątek | Opis |
|---|---|---|
errorcode:8004C600 |
DRM_E_SERVER_INTERNAL_ERROR |
Serwer zgłasza wyjątek wewnętrzny serwera |
Przykład:
http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c600)
Użycie: Testowanie odporności klienta na błędy wewnętrzne po stronie serwera.
Nieprawidłowa wiadomość
| Parametr | Wyjątek | Opis |
|---|---|---|
errorcode:8004C601 |
DRM_E_SERVER_INVALID_MESSAGE |
Żądanie wysłane do serwera było nieprawidłowe |
Przykład:
http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c601)
Użycie: Testowanie obsługi źle sformułowanych odpowiedzi żądań przez klienta.
Niezgodność wersji protokołu
| Parametr | Wyjątek | Opis |
|---|---|---|
errorcode:8004C60B |
DRM_E_SERVER_PROTOCOL_VERSION_MISMATCH |
Wersja protokołu określona w żądaniu nie była obsługiwana przez serwer |
Przykład:
http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c60b)
Użycie: Przetestuj zachowanie klienta z nieobsługiwanymi wersjami protokołu.
Wyjątek specyficzny dla usługi
| Parametr | Wyjątek | Opis |
|---|---|---|
errorcode:8004C604 |
DRM_E_SERVER_SERVICE_SPECIFIC |
Serwer zgłasza wyjątek specyficzny dla usługi (zazwyczaj z programu obsługi licencji) |
Przykład:
http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c604)
Użycie: Testowanie obsługi błędów specyficznych dla usługi przez klienta.
Wyjątki protokołu i przekierowania
Przekierowanie protokołu
| Parametr | Wyjątek | Opis |
|---|---|---|
errorcode:8004C60D |
DRM_E_SERVER_PROTOCOL_REDIRECT |
Protokół ma przekierowanie |
Przykład:
http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c60d)
Użycie: Testowanie obsługi klientów przekierowań serwera.
wyjątki Domain-Related
Wymagana domena
| Parametr | Wyjątek | Opis |
|---|---|---|
errorcode:8004C605 |
DRM_E_SERVER_DOMAIN_REQUIRED |
Serwer otrzymał standardowe żądanie licencji od klienta i wymaga, aby klient przyłączył się do domeny w celu otrzymania licencji powiązanej z domeną |
Przykład:
http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c605)
Użycie: Testowanie scenariuszy dołączania do domeny i rozpoznawania domeny klienta.
Odnawianie domeny
| Parametr | Wyjątek | Opis |
|---|---|---|
errorcode:8004C606 |
DRM_E_SERVER_RENEW_DOMAIN |
Serwer odebrał żądanie od klienta z certyfikatem domeny, w tym nieaktualną wersją domeny. Wymaga, aby klient zaktualizował certyfikat domeny |
Przykład:
http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c606)
Użycie: Testowanie procesów odnawiania certyfikatu domeny.
Osiągnięto limit urządzeń
| Parametr | Wyjątek | Opis |
|---|---|---|
errorcode:8004C602 |
DRM_E_SERVER_DEVICE_LIMIT_REACHED |
Serwer był gotów dodać klienta do konta domeny, ale konto osiągnęło już limit liczby urządzeń |
Przykład:
http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c602)
Użycie: Testowanie obsługi limitów urządzeń domeny przez klienta.
Nie jest członkiem domeny
| Parametr | Wyjątek | Opis |
|---|---|---|
errorcode:8004C60A |
DRM_E_SERVER_NOT_A_MEMBER |
Serwer otrzymał prawidłowe żądanie licencji powiązanej z domeną od klienta, ale klient został wcześniej usunięty z domeny przez usługę |
Przykład:
http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c60a)
Użycie: Przetestuj zachowanie klienta po usunięciu z domeny.
Nieznany identyfikator konta
| Parametr | Wyjątek | Opis |
|---|---|---|
errorcode:8004C60C |
DRM_E_SERVER_UNKNOWN_ACCOUNTID |
Serwer otrzymał żądanie licencji powiązanej z domeną od klienta dla określonego identyfikatora konta, ale ten identyfikator jest nieznany usłudze |
Przykład:
http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(errorcode:0x8004c60c)
Użycie: Przetestuj obsługę klienta nieznanych scenariuszy kont domeny.
Scenariusze testowania
Podstawowe testowanie wyjątków
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;
}
Testowanie wyjątków domeny
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;
}
Testowanie niezawodności klienta
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
}))
};
}
Wytyczne dotyczące implementacji klienta
Najlepsze rozwiązania dotyczące obsługi wyjątków
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);
}
}
Obsługa wyjątków w języku 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;
}
}
Walidacja i testowanie
Oczekiwane zachowania
Podczas testowania z wyjątkami serwera sprawdź, czy klient:
- Poprawnie analizuje wyjątki — poprawnie wyodrębnia kody błędów i komunikaty
- Obsługuje bezpiecznie — nie ulega awarii ani nie zawiesza się na wyjątkach
- Udostępnia opinie użytkowników — wyświetla odpowiednie komunikaty o błędach dla użytkowników
- Implementuje logikę ponawiania prób — ponawia próbę odpowiednich błędów z wycofywaniem
- Obsługuje operacje domeny — poprawnie obsługuje wyjątki związane z domeną
Lista kontrolna sprawdzania poprawności testów
- [ ] Klient prawidłowo identyfikuje typy wyjątków
- [ ] Wyświetlane są odpowiednie komunikaty użytkownika
- [ ] Klient nie ulega awarii w żadnym typie wyjątku
- [ ] Logika ponawiania prób działa w przypadku błędów możliwych do odzyskania
- [ ] Procesy dołączania/odnawiania domeny są poprawnie wyzwalane
- [ ] Funkcja odwoływania urządzeń jest obsługiwana bezpiecznie
- [ ] Wydajność pozostaje akceptowalna w warunkach błędu
Najlepsze praktyki
Rozwój klientów
- Kompleksowa obsługa błędów — obsługa wszystkich udokumentowanych typów wyjątków
- Środowisko użytkownika — podaj jasne, możliwe do działania komunikaty o błędach
- Strategia ponawiania prób — implementowanie odpowiedniej logiki ponawiania prób dla błędów przejściowych
- Zabezpieczenia — upewnij się, że odwołanie urządzenia uniemożliwia dostęp do zawartości
- Testowanie — testowanie wszystkich scenariuszy wyjątków podczas programowania
Odzyskiwanie błędu
- Łagodne obniżenie wydajności — kontynuuj operację, jeśli jest to możliwe
- Jasna komunikacja — informowanie użytkowników o problemach i rozwiązaniach
- Automatyczne odzyskiwanie — próba automatycznego rozwiązywania, jeśli jest to konieczne
- Opcje rezerwowe — udostępnianie alternatywnej zawartości lub usług
- Rejestrowanie — wyjątki dzienników na potrzeby debugowania i analizy
Powiązana dokumentacja
- Usługa PlayReady Test Server — główne funkcje serwera testowego
- Składnia ciągu zapytania — dokumentacja składni parametrów
- Testowanie ochrony danych wyjściowych — testowanie ochrony danych wyjściowych
- Serwery testowe PlayReady — kompletna dokumentacja serwera
Zasoby pomocy technicznej
Zapytania biznesowe
- Adres e-mail: playready@microsoft.com
Zapytania operacji
- Witryna internetowa: http://wmlalicensing.com/
- Adres e-mail: ipla@microsoft.com
Pomocy technicznej
- Portal pomocy technicznej: Pomoc techniczna PlayReady
Informacje o szkoleniu
- Adres e-mail: plyrdyev@microsoft.com
© Microsoft Corporation. Wszelkie prawa zastrzeżone. Znakami towarowymi | Prywatność