Ostatnio dość dużo pracowałem z usługą Azure Batch. W trakcie prac pojawiło się (jak zwykle) parę problemów. Jednym z nich były zbyt długie lub zawierające niedozwolone znaki ID Taska.
Wyjątek
Efektem tego było wystąpienie wyjątku Microsoft.Azure.Batch.AddTaskCollectionTerminatedException
. Natomiast w szczegółach pojawiał się kod i wiadomość wyjątku o następującej treści:Error.Code=InvalidPropertyValue, Error.Message=The value provided for one of the properties in the request body is invalid.
. Powód to tak jak pisałem długość i rodzaj znaków w id dodawanego taska: Task ids can only contain any combination of alphanumeric characters along with dash (-) and underscore (_). The name must be from 1 through 64 characters long
.
Wyjaśnienie
Działo się tak, gdyż ID Taska było nadawane dynamicznie i składało się z ID (Guid-a) wykonywanej pracy oraz nazwy procesowanego pliku. Takie dynamiczne tworzenie id taska powodowało zbyt dużą długość. Problemem były też znaki – niedozwolone są znaki spoza: alfanumerycznych, podkreślnika i myślnika. Wszelkie znaki specjalne, spacje, dwukropki itp. są niedozwolone.
Rozwiązanie
Po znalezieniu problemu rozwiązanie jest banalnie proste. Wystarczy zostawić w id taska tylko dozwolone znaki i skrócić go do maksymalnie 64 znaków. W tym celu napisałem extension method, którym się dzielę:
Pewnie pomyślisz dlaczego nie zastosowałem tutaj Regexa? Otóż Regex był 3 krotnie wolniejszy od powyższego rozwiązania z LINQ. W przypadku rozwiązania, które tworzyłem czas to faktycznie pieniądz, bo dodawanie tasków uruchamiane jest w Azure Functions, w którym płaci się nie tylko za liczbę ale i za czas wywołania.