Consumare il web service di Reporting Services

by andrea 16 July 2009 08:05

Ecco come utilizzare il web service di Reporting Services (utilizzando basicHttpBinding)
(sia per Reporting Services 2005 che per Reporting Services 2008)

Per poter utilizzare il (uno dei) web service esposto da Reporting Serives, si dovrà creare una Service Reference facendola puntare all'url
http://127.0.0.1/reportserver/ReportService2005.asmx?wsdl
dove 127.0.0.1 sarà l'IP della macchina dove è installato Reporting Services.

Aggiunta la referenza, verrà automaticamente generata la configurazione all'interno dell'app.config, e nell'elemento basicHttpBinding saranno da modificare:

  • in binding --> security: modificare l'attributo mode in TransportCredentialOnly
  • in binding --> security --> transport: impostare clientCredentialType e proxyCredentialType a Ntlm

La configurazione finale sarà quindi la seguente:

   1: <system.serviceModel>
   2:     <bindings>
   3:         <basicHttpBinding>
   4:             <binding name="ReportingService2005Soap" closeTimeout="00:01:00"
   5:                 openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
   6:                 allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
   7:                 maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
   8:                 messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
   9:                 useDefaultWebProxy="true">
  10:                 <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
  11:                     maxBytesPerRead="4096" maxNameTableCharCount="16384" />
  12:                 <security mode="TransportCredentialOnly">
  13:                     <transport clientCredentialType="Ntlm" proxyCredentialType="Ntlm"
  14:                         realm="" />
  15:                     <message clientCredentialType="UserName" algorithmSuite="Default" />
  16:                 </security>
  17:             </binding>
  18:         </basicHttpBinding>
  19:         <customBinding>
  20:             <binding name="ReportingService2005Soap12">
  21:                 <textMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16"
  22:                     messageVersion="Soap12" writeEncoding="utf-8">
  23:                     <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
  24:                         maxBytesPerRead="4096" maxNameTableCharCount="16384" />
  25:                 </textMessageEncoding>
  26:                 <httpTransport manualAddressing="false" maxBufferPoolSize="524288"
  27:                     maxReceivedMessageSize="65536" allowCookies="false" authenticationScheme="Ntlm"
  28:                     bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
  29:                     keepAliveEnabled="true" maxBufferSize="65536" proxyAuthenticationScheme="Ntlm"
  30:                     realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
  31:                     useDefaultWebProxy="true" />
  32:             </binding>
  33:         </customBinding>
  34:     </bindings>
  35:     <client>
  36:         <endpoint address="http://127.0.0.1:80/ReportServer/ReportService2005.asmx"
  37:             binding="basicHttpBinding" bindingConfiguration="ReportingService2005Soap"
  38:             contract="ReportingServices.ReportingService2005Soap" name="ReportingService2005Soap" />
  39:     </client>
  40: </system.serviceModel>

Ora, per poter invocare i metodi del web service è necessario impersonare un utente della macchina di Reporting Services (che abbia i diritti correttamente impostati), andando a settare i valori nelle rispettive proprietà della classe ClientCredentials.

Impersonato l'utente, sarà poi possibile invocare i metodi esposti dal servizio.

   1: using (ReportingService2005SoapClient rs = new ReportingService2005SoapClient())
   2: {
   3:     rs.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
   4:     rs.ClientCredentials.Windows.ClientCredential.UserName = "username";
   5:     rs.ClientCredentials.Windows.ClientCredential.Password = "password";
   6:     rs.ClientCredentials.Windows.ClientCredential.Domain = "domain";    
   7:  
   8:     CatalogItem[] items = null;
   9:     rs.ListChildren("/", true, out items);
  10:     // [...]
  11: }

Alcune ulteriori informazioni le potete trovare al seguente link:
Reporting Services Web Service

Per un progetto a cui stò lavorando, ho dovuto fare uno studio per alcune funzionalità che dovevano pesantemente interagire con il web service di Reporting Services.
Ho notato che le informazioni in rete sono un pò sparse e frazionate, e quindi mi è sembrato utile scrivere due righe per aiutare chi fosse ai primi passi (su questa problematica).

Tags:

ASP .NET | .NET | SQL Server | Reporting Services

Comments

04/11/2009 03:11 #

Reporting Services - report snapshots

Reporting Services - report snapshots

Andrea Dottor - il silenzio di un urlo |

Comments are closed