我们正在尝试将SSRS 2016移动报告嵌入到我们的MVC应用程序中。 我们尝试使用HTTP处理程序实现"反向代理,而SSRS身份验证设置为基本"。
使用基本身份验证的原因是并非所有访问此页面的用户都具有NTLM访问权限。 在rsreportserver.config中,我们将Authentication设置如下:
<Authentication>
<AuthenticationTypes>
<RSWindowsBasic>
<LogonMethod>3</LogonMethod>
<Realm></Realm>
<DefaultDomain>workgroup</DefaultDomain>
</RSWindowsBasic>
</AuthenticationTypes>
<RSWindowsExtendedProtectionLevel>Off</RSWindowsExtendedProtectionLevel>
<RSWindowsExtendedProtectionScenario>Proxy</RSWindowsExtendedProtectionScenario>
<EnableAuthPersistence>true</EnableAuthPersistence>
</Authentication>
所以一般来说,重定向到我们页面的链接被分区为:// AppServer / KEYWORD / ReportPath 在代码隐藏中,我们不仅为KEYWORD设置处理程序,还为页面内的元素设置处理程序,如assests和api。这样我们就可以获得移动报告的全部内容
(// Server / ReportS / mobilereport / ReportPath)并将其写入我们的OutputStream。 在处理程序中,正在设置请求的身份验证标头。
问题是OAuth.js一直在使用net:ERR_CONNECTION_RESET失败。 即使rs:Embed = true包含在URL中,我们也永远不会重定向到该特定报告,而是重定向到主页。
为什么经常失败? 我该如何直接加载报告?
Handler的代码片段:
public void Process(HttpContext context) {
HttpResponse response = context.Response;
string uri = "value";
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(new Uri(uri));
webRequest.Method = context.Request.HttpMethod;
webRequest.ImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
string svcCredentials = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(username + ":" + password));
webRequest.Headers.Add("Authorization", "Basic " + svcCredentials);
HttpWebResponse serverResponse = null;
try {
serverResponse = (HttpWebResponse)webRequest.GetResponse();
}
catch (WebException webExc)
{
response.StatusCode = 500;
response.StatusDescription = webExc.Status.ToString();
response.End();
return;
}
response.ContentType = serverResponse.ContentType;
const int blockSize = 2048;
byte[] contentBlock = new byte[blockSize];
long bytesToRead = serverResponse.ContentLength;
Stream dataStream = serverResponse.GetResponseStream();
while (bytesToRead > 0) {
int blockToRead = (int)Math.Min(blockSize, bytesToRead);
int bytesRead = dataStream.Read(contentBlock, 0, blockToRead);
bytesToRead -= bytesRead;
context.Response.OutputStream.Write(contentBlock, 0, bytesRead);
}
serverResponse.Close();
context.Response.OutputStream.Close();
context.Response.End();
}
注意:我们正在使用此处理程序,因为我们知道报表查看器无法满足移动报表