尝试集成Java和SSRS 2012

时间:2013-04-29 19:39:57

标签: java sql-server reporting-services

我正在尝试编写一个将显示SSRS 2012报告的Java应用程序。我设置了我的Web服务代理,并且我有这个代码尝试登录服务器:

try
{
    ReportExecutionServiceSoapStub service = getService();
    System.out.println("ADP1N: Test.main, Checkpoint Bravo...");
    service.logonUser("CAMPUSAD/<username>", "<password>", "");
} catch (Exception e)
{
    e.printStackTrace();
}

但我一直收到这个错误:

Apr 29, 2013 3:29:32 PM org.apache.commons.httpclient.HttpMethodDirector authenticate
SEVERE: Credentials cannot be used for NTLM authentication:         org.apache.commons.httpclient.UsernamePasswordCredentials
org.apache.commons.httpclient.auth.InvalidCredentialsException: Credentials cannot be used for NTLM authentication: org.apache.commons.httpclient.UsernamePasswordCredentials
at org.apache.commons.httpclient.auth.NTLMScheme.authenticate(NTLMScheme.java:331)
at org.apache.commons.httpclient.HttpMethodDirector.authenticateHost(HttpMethodDirector.java:281)
at org.apache.commons.httpclient.HttpMethodDirector.authenticate(HttpMethodDirector.java:233)
at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:169)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:396)
at org.apache.axis.transport.http.CommonsHTTPSender.invoke(CommonsHTTPSender.java:196)
at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
at org.apache.axis.client.AxisClient.invoke(AxisClient.java:165)
at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
at org.apache.axis.client.Call.invoke(Call.java:2767)
at org.apache.axis.client.Call.invoke(Call.java:2443)
at org.apache.axis.client.Call.invoke(Call.java:2366)
at org.apache.axis.client.Call.invoke(Call.java:1812)
at com.microsoft.schemas.sqlserver._2005._06._30.reporting.reportingservices.ReportExecutionServiceSoapStub.logonUser(ReportExecutionServiceSoapStub.java:1893)
at Test.main(Test.java:29)
Apr 29, 2013 3:29:32 PM org.apache.commons.httpclient.HttpMethodDirector processWWWAuthChallenge
INFO: Failure authenticating with NTLM <any realm>@ais-fgnk3k1:80
AxisFault
 faultCode: {http://xml.apache.org/axis/}HTTP
 faultSubcode: 
 faultString: (401)Unauthorized
 faultActor: 
 faultNode: 
 faultDetail: 
    {}:return code:  401

    {http://xml.apache.org/axis/}HttpErrorCode:401

(401)Unauthorized
    at org.apache.axis.transport.http.CommonsHTTPSender.invoke(CommonsHTTPSender.java:218)
    at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
    at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
    at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
    at org.apache.axis.client.AxisClient.invoke(AxisClient.java:165)
    at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
    at org.apache.axis.client.Call.invoke(Call.java:2767)
    at org.apache.axis.client.Call.invoke(Call.java:2443)
    at org.apache.axis.client.Call.invoke(Call.java:2366)
    at org.apache.axis.client.Call.invoke(Call.java:1812)
    at com.microsoft.schemas.sqlserver._2005._06._30.reporting.reportingservices.ReportExecutionServiceSoapStub.logonUser(ReportExecutionServiceSoapStub.java:1893)
    at Test.main(Test.java:29)

我甚至试过这段代码并得到了相同的结果:

ExecutionInfo info = service.loadReport("http://usys-dbd1.dev.ais.msu.edu/ReportServer/Pages/ReportViewer.aspx?%2fUSYS%2fAdvisor+Scheduling%2fAdvisor_Scheduling_Report&amp;rs:Command=Render", null);

我的rsreportserver.config文件包含以下身份验证条目:

<Authentication>
    <AuthenticationTypes>
         <RSWindowsNegotiate />
         <RSWindowsKerberos />
         <RSWindowsNTLM />
    </AuthenticationTypes>
    <RSWindowsExtendedProtectionLevel>Off</RSWindowsExtendedProtectionLevel>
    <RSWindowsExtendedProtectionScenario>Proxy</RSWindowsExtendedProtectionScenario>
    <EnableAuthPersistence>true</EnableAuthPersistence>
</Authentication>

我不确定我在这里做错了什么。

2 个答案:

答案 0 :(得分:0)

无需查看“GetService()”方法,以及需要对服务进行身份验证的一些事项。我首先看看你是否可以在本地测试一些代码,你知道这个用户有权管理这个网站。我已编写代码与SSRS交谈但仅在C#.NET中,但我不确定Java。现在我有几种方法可以传统地从SSRS获取数据:

  1. 只需直接从网络服务查看网址: http://(servername)/ReportServer/Pages/ReportViewer.aspx(Path)&amp; rs:Command = Render

  2. 从Web服务填充HTML表单对象。我和上面类似,但是:

    <form id="ssrsform" action="(link above or similar)" method="post" target="_self" >
     .....(options and settings)....
    </form>
    
  3. 创建一个具有“报告”控件的.NET项目,您可以直接联系SSRS服务器,而不是在选项下有本地报告。

  4. 在代理类的代码中完全创建服务器RDL对象: 我在这里有另一个线程:Programmatically Export SSRS report from sharepoint using ReportService2010.asmx关于如何使用C#和.NET,其中一些可能适用于Java,但我不确定。关键部分是测试这个顶部:

    ReportExecutionService rs = new ReportExecutionService();
    rs.Credentials = System.Net.CredentialCache.DefaultCredentials;
    rs.Url = "http://myserver/reportserver/ReportExecution2005.asmx";
    
  5. 如果您想要使用该路由,通常需要拥有代理类或Web服务,通​​常是调用SSRS服务器。您需要进行身份验证。你需要确保你联系到正确的位置,否则它会挂断你。

    编辑5-3-13:

    在大多数托管报告解决方案中,我知道版本2008,2008 R2,2012(从未在2005年使用过SSRS),您应该从下面显示的下拉列表中看到类似于下面“C”部分的内容PIC。如果您说您的凭据在报告中,您应该能够在托管后更改它们。 SSRS的Web服务与其数据库联系,该数据库包含您的所有设置,您可以在部署后自由更改它们。这是我真正喜欢SSRS的事情之一,如果它是一个小的改变,你可以改变托管对象,而不必重新部署对象。问题出现时,系统会提示您,并且在每种情况下我都看到这是默认行为,当设置了“运行报表的用户提供的凭据”选项并且未存储凭据时。

    但是,如果未设置其他设置,则可能无法看到这些设置。如果您只是一个浏览器,则无权更改内容。如果您没有看到设置,那么这是问题的主要原因,因为您无法设置它们。首次设置SSRS时,最初的步骤之一是让默认管理员进入本地安装的Web位置,并设置需要管理员访问权限的用户。通常你进入站点设置,添加一个'系统管理员',然后SSRS在它的荣耀中有另一个安全设置,用于“文件夹设置”中对象的实际遍历。您还需要设置这些安全设置。您需要确保您的代理帐户具有“内容管理器”权限(如果您严格,则可能更少,内容管理器最高)。老实说,SSRS的安全性在我看来非常混乱,也是很多人的抱怨,也是恕我直言的理由。

    一般来说,权利继承了树结构,如果您在名为“report1.rdl”的“报告”下发布报告,通常是Home / Reports / report1.rdl,您有权查看主文件夹,报告文件夹,以及报告对象。但是......作为管理员的人可以覆盖此链的任何部分并将其破坏。在我工作的公司,我继承了意大利面条,一次只设置一个对象,因为他们没有正确设置AD组,并且在组织单元结构中一次完成一个目录。如果你很了解TSQL,你可以通过Sql management Studio直接从数据库结构中查询权限,默认是DB的“ReportServer”和大多数对象所在的表我认为是CATALOG。

    这是一张图片,为了更好地解释,我认为我的环境是SSRS 2008R2,但2008和2012非常相似。 enter image description here

答案 1 :(得分:0)

如果从Windows 7调用报告,则可能必须使用NTLM V2身份验证,如下所述。我们已经实现了相同的逻辑(仅删除了日志)并且能够解决问题。

http://devsac.blogspot.com/2010/10/supoprt-for-ntlmv2-with-apache.html