SSRS-export mislukt via een clientloze VPN-portal: wat er anders is
De rapportpagina bewijst weergave, niet export. Volg het exportverzoek door de portal, vergelijk headers en body, en beperk daarna elke uitzondering nauw.
Het rapport opent in de browser, de parameters worden weergegeven en de exportknop levert een fout, een lege download of een bestand dat de spreadsheet weigert te openen. Die combinatie heeft een standaardvorm. Een werkende rapportpagina heeft weergave en authenticatie getest en niets anders. De export is een apart verzoek met een eigen antwoord, en via een clientloze portal passeert het ook een herschrijflaag die nooit voor bestandsdownloads is ontworpen.
Twee paden, één werkende pagina
Weergeven en exporteren zijn verschillende bewerkingen, zelfs wanneer ze van dezelfde knop beginnen. De rapportserver rendert de pagina voor een browser en rendert de export via een andere uitvoerextensie met een eigen inhoudstype en een eigen foutgedrag, zoals de exportdocumentatie beschrijft. Een portal die het eerste perfect doorlaat, kan het tweede nog steeds beschadigen, omdat het tweede een antwoord is dat de portal niet verwachtte te zien. De twee delen een sessie en een adres, en bijna niets anders.
Behandel de werkende pagina alleen als bewijs van authenticatie en bereikbaarheid. Hij bewijst dat het account de rapportserver kan bereiken en dat de portal HTML doorstuurt. Hij zegt niets over bestandsantwoorden, content-disposition-headers of omleidingen die in een download eindigen in plaats van in een document.
Dat is de hele reden om het exportpad apart te vergelijken in plaats van de pagina die al werkt opnieuw te testen. Twee verzoeken die een sessie delen, zijn nog steeds twee verzoeken.
Drie voorwaarden die bepalen waar de export breekt
Drie vragen plaatsen de fout snel, en elk antwoord wijst naar een andere eigenaar.
Ten eerste, exporteert hetzelfde rapport, account en formaat correct vanuit het interne netwerk? Als dat zo is, zijn de rapportserver en zijn renderer in orde en zit het verschil in het toegangspad. Ten tweede, draagt het mislukte antwoord een bestandsinhoudstype, of een HTML-pagina met een bestandsextensie? Dat scheidt een rendererfout van een vervanging door de portal. Ten derde, herschrijft de portal de URL van het verzoek of verwijdert hij headers uit het antwoord? Een herschreven URL kan op een heel ander eindpunt belanden.
Beantwoord alle drie voordat u een instelling wijzigt, want elk heeft een andere oplossing. Een rendererfout hoort bij de rapportserver, een vervangen body hoort bij de portal, en een verwijderde header is een beleidsvraag en geen bug.
Schrijf de antwoorden op. Een supportcase opgebouwd uit die drie regels is tien screenshots waard.
Lees het exportantwoord in plaats van de statuscode
Een geslaagde HTTP-status bewijst alleen dat iets het verzoek heeft beantwoord. Inspecteer de body en de headers samen, want de interessante fout is een geslaagd antwoord met de verkeerde inhoud.
curl -sS -D export.headers -o export.bin --location "https://portal.example.com/reports/export?format=xlsx"
file export.bin
head -c 300 export.bin
De headerdump toont het inhoudstype en elke content-disposition die de portal heeft teruggegeven. Het commando file identificeert wat de body werkelijk is, en een tekstbestand waar een spreadsheet werd verwacht is de klassieke vervangen aanmeldpagina. Het commando head toont genoeg om HTML te herkennen zonder een heel rapport in een terminal te storten.
Verwijder sessiecookies en tokens voordat u er iets van deelt. Een opname van een werkende export is nuttig bewijs, en een opname van een sessie die van iemand anders is, is een incident.
Beperk de uitzondering tot de applicatie, niet tot het account
Als de portal het antwoord herschrijft of blokkeert, is de verleidelijke reparatie het hele terrein vrijstellen of het rapport anoniem maken. Beide verhelpen de download en verwijderen de reden waarom de portal bestaat. Een nauw begrensde uitzondering noemt één applicatiepad, één inhoudstype en één richting, en blijft beoordeelbaar voor wie het beleid bezit.
Gebruik de gatewayversie die u daadwerkelijk draait en de gedocumenteerde applicatie-instellingen ervan. Een optie die een leverancier ooit beschreef als het onveranderd laten van verkeer is geen algemene instructie, en het kopiëren ervan uit een oude forumthread is hoe een tijdelijke uitzondering permanente architectuur wordt.
Als de uitzondering niet zo nauw kan worden begrensd, hoort de export waarschijnlijk op het interne pad met een andere toegangsmethode in plaats van achter de portal. Een vrijstelling voor het hele terrein is een beslissing voor de portaleigenaar, geen omweg voor één rapport.
Accepteer de export, niet het Opslaan-dialoogvenster
De laatste controle is het bestand zelf: het opent, het bevat de verwachte kolommen en de totalen komen overeen met het rapport dat de gebruiker heeft goedgekeurd.
Dat een Opslaan-dialoogvenster verschijnt is geen succes, en een bestand dat met een reparatiewaarschuwing opent is dat ook niet. Vergelijk een rijaantal en één bekende waarde met het rapport op het scherm, want een afgekapte export slaagt voor elke test die alleen naar de bestandsgrootte kijkt. Exporteer daarna een tweede keer, want een cachelaag die één keer de verkeerde body levert, levert misschien de volgende keer de juiste.
Accepteer de werkstroom die de gebruiker nodig had, en niets minder. Een download die in de verkeerde applicatie opent, is nog steeds een mislukte export.