2

(с использованием C#, Web API, SQL Server2012 ж/сервера отчетов, проверка подлинность NTLM)перемежающихся 401-Несанкционированный ответ от SSRS

Я получаю прерывистую ошибку при попытке загрузить отчет (как первенствует документ) от SSRS. Я пристроить правильный URL, чтобы сделать отчет, как:

http://sqlServer/ReportServer/Pages/ReportViewer.aspx?/TheReportName&rs:Command=Render&rs:format=excel&rc:Parameters=false&Region=WEST&CutOffDate=10/25/2015

WebClient webClient = new WebClient(); 
webClient.Credentials = new NetworkCredential("myDom\\myReportReader", "[email protected]"); 
    //string credentials = Convert.ToBase64String(
    // Encoding.ASCII.GetBytes("myDom\\myReportReader" + ":" + [email protected]")); 
    //webClient.Headers[HttpRequestHeader.Authorization] = string.Format("Basic {0}", credentials); 

//401 Unauthorized thrown here: 
return new MemoryStream(webClient.DownloadData(reportUrl)); 

Цель здесь состоит в том, что контроллер Web API на общественной облицовке IIS загружает FILESTREAM с внутренним/брандмауэра защищенного SSRS, а затем передает поток в браузер. Это РАБОТАЕТ иногда ... когда он не возвращает ошибку 401 на последней строке ... Замеченная строка представляет собой попытку решить проблему, которая не сработала.

ответ

2

Одним из решений является изменение запрашиваемого URL-адреса.

SSRS отвечает перенаправлением (http status 302), когда вы хотите экспортировать отчет через ReportViewer.aspx. И WebClient не перенаправляет учетные данные на перенаправленную страницу.

Вы должны запросить отчет в следующем формате: http://sqlServer/ReportServer?/TheReportName&rs:Format=EXCEL&rc:Parameters ... так просто удалить из URL последовательности: /Pages/ReportViewer.aspx.

Подробнее об экспорте отчетов с помощью доступа URL здесь: https://msdn.microsoft.com/en-us/library/ms154040.aspx

Другого решением является оставить неоптимальную URL и использовать CredentialCache, он будет предоставлять учетные данные перенаправленной страницы, но не забудьте установить параметр Uri только для URL-адреса префикс, то есть 'http: // sqlServer' или 'http: // sqlServer/ReportServer', не более.

WebClient webClient = new WebClient(); 
var nc = new NetworkCredential("myReportReader", "[email protected]", "myDom"); 
var cc = new CredentialCache{{new Uri("http://sqlServer"), "Ntlm", nc}}; 
webClient.Credentials = cc; 
return new MemoryStream(webClient.DownloadData(reportUrl)); 
+0

Фактически я пришел к первому решению в качестве рабочего решения. Я также попробовал второй подход, и он не изменил результаты, которые я получал. –

 Смежные вопросы

  • Нет связанных вопросов^_^