SQL Server 2012 Reporting Services Error
We were upgrading one of our SQL Server 2008 R2 server to SQL Server 2012. Everything went smooth expect for one report in which was using reporting services. This report was calling the reporting service webservice and was passing in a huge xml parameter. This XML parameter would work fine for smaller string lengths but failed for larger strings. The error was specifically:
library!ReportServer_0-2!4ac!05/11/2012-14:26:30:: e ERROR: Throwing Microsoft.ReportingServices.Diagnostics.Utilities.InternalCatalogException: Internal error, Microsoft.ReportingServices.Diagnostics.Utilities.InternalCatalogException: An internal error occurred on the report server. See the error log for more details. ---> System.UriFormatException: Invalid URI: The Uri string is too long.
at System.Uri.EscapeString(String input, Int32 start, Int32 end, Char[] dest, Int32& destPos, Boolean isUriString, Char force1, Char force2, Char rsvd)
at System.Uri.EscapeDataString(String stringToEscape)
at Microsoft.ReportingServices.Common.UrlUtil.UrlEncode(String input)
at Microsoft.ReportingServices.ReportProcessing.ParameterInfoCollection.UrlEncodeSingleParam(StringBuilder url, String name, Object val, Func`2 cs)
at Microsoft.ReportingServices.ReportProcessing.ParameterInfoCollection.ToUrl(Boolean skipInternalParameters, Func`2 cs)
at Microsoft.ReportingServices.Library.ReportExecutionBase.WriteParametersToJobContext(RunningJobContext jobContext)
at Microsoft.ReportingServices.Library.ReportExecutionBase.Execute()
at Microsoft.ReportingServices.Diagnostics.CancelablePhaseBase.ExecuteWrapper()
--- End of inner exception stack trace ---;
As you can see, the error message is “Invalid URI: The Uri string is too long.”. We knew the problem was with the huge XML parameter and wanted to find out what got changed from SQL Server 2008 R2 to SQL Server 2012. So, I opened up reflector and started comparing the code in 2008 R2 with the one from SQL Server 2012.
| SQL Server 2008 R2 execution path |
private void WriteParametersToJobContext(RunningJobContext jobContext) |
| SQL Server 2012 execution path |
private void WriteParametersToJobContext(RunningJobContext jobContext) |
As you can see above, SQL Server 2008 R2 while using the String Builder type is not performing any checks on the size limit. But SQL Server 2012 is throwing an exception when the site is greater than 65520 characters. This was the problem and we ended up modifying our code to fix this issue.
