【问题标题】:Running report on JasperServer from C#从 C# 在 JasperServer 上运行报告
【发布时间】:2011-11-27 23:30:23
【问题描述】:

Jasper Reports 是 Crystal Reports 的出色开源替代品。它非常适合单页 PDF 页面,例如信件和发票到多页报告。然而,它对 .NET 不是很友好,并且让 C#/Mono 与 JasperServer 配合得很好也没有什么成果。

有没有人知道如何从 C# 在 JasperServer 上运行报告,并在 SOAP 请求中附加 XML 数据集的代码示例?它需要在 Mono 上工作,所以 Microsoft.Web.Services2 是不可能的。

我尝试提出自己的肥皂请求。 Jasper Server 似乎接受了它,但除了服务器 500 错误之外,我似乎无法得到任何响应。我还没有附加 MTOM 附件。

var sb = new StringBuilder();

sb.AppendLine("<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">");
sb.AppendLine("<s:Body s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">");
sb.AppendLine("<q1:runReport xmlns:q1=\"http://axis2.ws.jasperserver.jaspersoft.com\">");

sb.AppendLine("<requestXmlString xsi:type=\"xsd:string\">");
sb.AppendLine("<request operationName=\"runReport\" locale=\"en\">");
sb.AppendLine("    <argument name=\"RUN_OUTPUT_FORMAT\">PDF</argument>");
sb.AppendFormat("    <resourceDescriptor name=\"\" wsType=\"\" uriString=\"{0}\" isNew=\"false\">", "/JourneyReport");
sb.AppendLine("      <label>null</label>");
sb.AppendLine("      <parameter name=\"testparam\">1</parameter>");
sb.AppendLine("    </resourceDescriptor>");
sb.AppendLine("  </request>");
sb.AppendLine("</requestXmlString>");
sb.AppendLine("</q1:runReport>");
sb.AppendLine("</s:Body></s:Envelope>");


var webRequest = (HttpWebRequest)WebRequest.Create("http://localhost:8080/jasperserver/services/repository");
webRequest.Credentials = new NetworkCredential("jasperadmin","jasperadmin");
webRequest.PreAuthenticate = true;

webRequest.Headers.Add("SOAPAction","");

//Set HttpWebRequest properties
byte[]  bytes = System.Text.Encoding.UTF8.GetBytes(sb.ToString());
webRequest.Method = "POST";
webRequest.ContentLength = bytes.Length;
webRequest.ContentType = "text/xml; encoding='utf-8'";

//Get Stream object 
var objRequestStream = webRequest.GetRequestStream();
objRequestStream.Write(bytes, 0, bytes.Length);
objRequestStream.Close();

var response = (HttpWebResponse)webRequest.GetResponse();

【问题讨论】:

标签: c# soap mono jasper-reports jasperserver


【解决方案1】:

Jasper 给出了一个Web Services API,你已经找到了,我想。因为它是使用 XML 的 Web 服务,所以当您将服务描述 (WSDL) 转换为该语言上的服务存根时,可以通过任何语言(如本例中的 C#)访问它。

在该给定链接上可以找到 Jasper Reports wsdl 文件位置,在访问它们之后,您的任务是创建存根,这是对给定 XML 接口的代码级访问。对于 Mono,这可以根据this tutorial 使用简单的命令行命令来完成,剩下的工作就是按照您的意愿使用此代码。

可以通过这两个链接找到确切的命令,没有什么魔力,但它就像一个命令运行wsdl.exe 并以给定路径(例如http://localhost:8080/jasperserver/services/repository?wsdl)作为参数然后编译结果一样简单类似于 mcs /target:library SomeService.cs -r:System.Web.Services 的命令,您将 SomeService.cs 替换为上一个命令输出的文件名。

就是这样!

【讨论】:

  • 如何添加XML数据源附件?有 XML Soap 请求,附件是报告的 XML 数据
【解决方案2】:

我不是在单声道中而是在使用 Visual Studio 时遇到了同样的问题。我总是收到错误 500。那是因为 jasperserver 根据 microsoft/mono 代码的答案不符合 SOAP。 ASP.NET 需要一个 text/xml 结构,而 jasperserver 发送回一个多部分结构,其中 xml 作为第一部分,报告作为第二部分的附件。

ASP.NET 对此给出了一个例外。我现在正在尝试使用 REST 做类似的事情,但到目前为止我还没有成功。

添加:2012-03-09 使用 REST 解决,参见Get report from jasperserver using REST webservice and asp.net C#

顺便说一句,这也适用于 Mono! (我在 Visual Studio 中开发,但在 Mono 上部署)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多