Hier ben ik een middag aan kwijtgeraakt. Ik schrijf het op, voor het geval het iemand anders dezelfde zoektocht bespaart.

De omgeving is een on-prem Power BI Report Server, volledig gepatcht, met de release van mei 2026 (1.26.9637.31070, build 15.0.1121.109). Ik had een rapport dat ik moest publiceren, maar eerst moest ik een hele reeks connection strings vervangen. Dat met de hand doen in Desktop is een ramp, dus ik nam een kortere weg. Die bleek de bron van al mijn ellende. Daarover hieronder meer.

De fout

Toen ik de pbix via de portal probeerde te uploaden, kreeg ik alleen dit:

An error has occurred. There was an error uploading your .pbix file. Verify that the file has not been corrupted and that the file extension matches the format of the file.

Daar heb je ongeveer net zoveel aan als aan een schouderophalen. Het bestand was niet corrupt. Het opende zonder problemen in de Report Server-versie van Power BI Desktop. De extensie klopte. De melding stuurt je dus de compleet verkeerde kant op.

Wat er echt in de log stond

Het echte verhaal stond in RSPowerBI.log (onder ...\PBIRS\LogFiles). Elke poging tot uploaden eindigde op dezelfde manier:

ERROR|Failure in reportproperties | System.ArgumentNullException: Value cannot be null.
Parameter name: s
at System.IO.StringReader..ctor(String s)
at Newtonsoft.Json.Linq.JObject.Parse(String json, JsonLoadSettings settings)
at Microsoft.PowerBI.ReportServer.PbixLib.Parsing.PbixParserV1.GetReportDocumentFromPowerBIPackage(IPowerBIPackage powerBIPackage)
at Microsoft.PowerBI.ReportServer.PbixLib.Parsing.PbixParserV1.ParsePbixFileIntoParts(Stream pbixFileAsStream, String requestId, String sessionId, Boolean areCustomVisualsEnabled)
at Microsoft.PowerBI.ReportServer.PbixLib.Parsing.PbixParserV1.ParsePbixFileIntoParts(Stream pbixFileAsStream, String requestId, String sessionId)
at Microsoft.PowerBI.ReportServer.WebApi.PbiApi.PbiApiController.<ShredFromStream>d__39.MoveNext()

Let ook op wat er net daarvoor in de log staat: het datamodel laadt zonder problemen (LoadDatabaseAsync: Successfully EnsureDbLoaded ... modelId=...). De server kan het model dus prima lezen. Hij valt een stap later om, op de rapportlayout.

GetReportDocumentFromPowerBIPackage vraagt het package om het ene Layout-document, krijgt null terug, geeft die null door aan JObject.Parse, en dan gaat alles onderuit. De server geeft een 400 terug, en de portal maakt daar de algemene melding over een corrupt bestand van die je hierboven zag.

Hoe ik hier terechtkwam

Hier moet ik toegeven dat ik het mezelf heb aangedaan.

Ik wilde die wijzigingen in de connection strings met een script doen. Dus verhuisde ik de pbix naar een machine met de gewone (Store) Power BI Desktop en zette ik hem om naar het enhanced report format (PBIR). Dan krijg je een map met JSON die je met code kunt aanpassen, in plaats van één ondoorzichtige Layout-blob. Wijzigingen gedaan, terug opgeslagen als pbix, klaar. Dacht ik.

Het probleem: een PBIR-rapport heeft geen los Layout-document. Het heeft een map Report\definition\ met report.json en een structuur van pagina’s. De parser van Report Server (PbixParserV1) verwacht nog steeds het klassieke losse Layout-bestand. Vindt hij dat niet, dan krijg je de null en sneuvelt de upload. Het is trouwens geen versieprobleem. Server en RS Desktop draaien allebei dezelfde build van mei 2026. Het probleem is het formaat in het bestand, niet de build die het schreef.

Wat ik geprobeerd heb (en wat niet werkte)

Een paar dingen, in deze volgorde:

Gecontroleerd of de builds gelijk waren. Server en Report Server Desktop zijn precies dezelfde release. De gebruikelijke oorzaak, “rapport gemaakt met een nieuwere versie van Desktop”, viel dus af.

PBIR weer uitgezet en opnieuw opgeslagen. In Desktop, onder Options > Preview features, vinkte ik Power BI Project (.pbip) save option en Store PBIX reports using enhanced metadata format (PBIR) uit. Daarna sloeg ik het rapport met Save As op als nieuwe pbix. Het idee was dat Desktop het rapport dan weer als klassieke Layout zou wegschrijven.

Gecontroleerd in plaats van erop vertrouwd. Een pbix is gewoon een zip. Dus kopieerde ik het nieuwe bestand, hernoemde het naar .zip en keek erin. Staat er een bestand Report\Layout in, dan ben je klassiek en kun je verder. Zie je nog een map Report\definition\, dan ben je nog steeds PBIR en blijft de upload mislukken. In de mijne stond de map definition nog. Het terugzetten was gewoon niet gelukt.

Gezocht naar een backup van vóór PBIR. Die was er niet. De enige kopie die ik had, was de PBIR-versie. Dat deed echt pijn.

Waar ik uitkwam

Dus geen slimme oplossing. Ik bouw het rapport opnieuw op, op hetzelfde model. Vervelend, maar ik weet nu tenminste waar ik aan toe ben.

Twee dingen neem ik hieruit mee:

Houd PBIR ver weg van alles wat op Report Server moet landen. Scripten is echt handig, maar de parser op de server leest dat formaat niet, en een Save As zet het niet betrouwbaar terug.

En bewaar een klassieke kopie van je pbix voordat je iets omzet. Vijf seconden “eerst een backup” had me een herbouw bespaard.

Heeft iemand het echt voor elkaar gekregen om een PBIR-rapport terug te zetten naar een klassieke Layout die wel uploadt? Dan hoor ik graag hoe. Voor nu doe ik het op de langzame manier.

Veelgestelde vragen

Waarom zegt Power BI Report Server dat er een fout was bij het uploaden van mijn .pbix-bestand?

De melding wijst op een corrupt bestand, maar het bestand kan prima in orde zijn. Een pbix die in het PBIR-formaat is opgeslagen, heeft geen los Layout-document, en de parser van Report Server verwacht dat nog wel.

Waar vind ik de echte fout als een pbix-upload op Report Server mislukt?

Open RSPowerBI.log in de map LogFiles van PBIRS. Een mislukte upload toont een ArgumentNullException ("Value cannot be null") die optreedt bij het parsen van de rapportlayout in PbixParserV1.

Kan Power BI Report Server PBIR-rapporten openen?

Nee. De parser PbixParserV1 in de release van mei 2026 verwacht het klassieke losse Layout-bestand. Houd PBIR weg van alles wat op Report Server moet landen.

Hoe controleer ik of een pbix-bestand PBIR of klassiek is?

Een pbix is een zip. Hernoem een kopie naar .zip en kijk erin. Een bestand Report\Layout betekent klassiek en klaar om te uploaden. Een map Report\definition betekent PBIR, en dan blijft de upload mislukken.

Kan ik PBIR uitzetten en de pbix opnieuw opslaan?

Niet betrouwbaar. Na het uitvinken van de preview-opties voor PBIR en .pbip en een Save As stond de map definition nog steeds in het nieuwe bestand. Bewaar een klassieke pbix als backup voordat je iets omzet.

Reacties

Je e-mailadres wordt niet getoond. Een foto komt van Gravatar, als je die hebt.