将SSRS 2016移动报告嵌入MVC应用程序

时间:2018-01-12 07:12:46

标签: asp.net-mvc reporting-services handler ssrs-2016

我们正在尝试将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();
      }

注意:我们正在使用此处理程序,因为我们知道报表查看器无法满足移动报表

0 个答案:

没有答案