using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Threading;
using Microsoft.WindowsAzure.Diagnostics;
using Microsoft.WindowsAzure.ServiceRuntime;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Auth;
using Microsoft.WindowsAzure.Storage.Blob;
using Microsoft.Reporting.WebForms;
using System.IO;
namespace WorkerRole1
{
publicclass WorkerRole : RoleEntryPoint
{
publicoverridevoid Run()
{
// This is a sample worker implementation. Replace with your logic.
Trace.WriteLine("$projectname$ entry point called", "Information");
while (true)
{
try
{
Trace.WriteLine("Rendering a report", "Information");
//Instantiate an instance of the ReportViewer control
//Since all I am doing is rendering, this is much easier than doing SOAP API calls
Microsoft.Reporting.WebForms.ReportViewer rv = new Microsoft.Reporting.WebForms.ReportViewer();
rv.ProcessingMode = ProcessingMode.Remote;
rv.ServerReport.ReportServerUrl = new Uri(RoleEnvironment.GetConfigurationSettingValue("RSUrl"));
rv.ServerReport.ReportPath = RoleEnvironment.GetConfigurationSettingValue("ReportPath");
rv.ServerReport.ReportServerCredentials = new WebRole1.ReportServerCredentials(RoleEnvironment.GetConfigurationSettingValue("User"), RoleEnvironment.GetConfigurationSettingValue("Password"), RoleEnvironment.GetConfigurationSettingValue("RSUrl").Replace("http://", ""));
Warning[] warnings;
string[] streamids;
string mimeType;
string encoding;
string extension;
byte[] bytes = rv.ServerReport.Render(
"PDF", null, out mimeType, out encoding, out extension,
out streamids, out warnings);
Trace.WriteLine("Writing report to storage");
//first, set up the connection to blob storage
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(Microsoft.WindowsAzure.CloudConfigurationManager.GetSetting("TargetReportStorage"));
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
// Retrieve a reference to a container that already exists
CloudBlobContainer container = blobClient.GetContainerReference(RoleEnvironment.GetConfigurationSettingValue("TargetContainer"));
container.CreateIfNotExists();
// Retrieve reference to a blob named "myblob".
CloudBlockBlob blockBlob = container.GetBlockBlobReference(Guid.NewGuid().ToString() + ".pdf");
MemoryStream fs =
new MemoryStream();
fs.Write(bytes, 0, bytes.Length);
fs.Seek(0, SeekOrigin.Begin);
blockBlob.UploadFromStream(fs);
}
catch (Exception ex)
{
Trace.WriteLine(ex.Message + ex.StackTrace);
}
Thread.Sleep(Convert.ToInt32(RoleEnvironment.GetConfigurationSettingValue("BetweenReportsMS")));
}
}
publicoverridebool OnStart()
{
// Set the maximum number of concurrent connections
ServicePointManager.DefaultConnectionLimit = 12;
try
{
// For information on handling configuration changes
// see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.
DiagnosticMonitorConfiguration config = DiagnosticMonitor.GetDefaultInitialConfiguration();
// Schedule a transfer period of 30 minutes.
config.Logs.ScheduledTransferPeriod = TimeSpan.FromMinutes(1.0);
// Display information about the default configuration.
//ShowConfig(config);
// Apply the updated configuration to the diagnostic monitor.
// The first parameter is for the connection string configuration setting.
DiagnosticMonitor.Start("Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString", config);
}
catch (Exception e)
{
Trace.WriteLine("Exception during WebRole1.OnStart: " + e.ToString());
// Take other action as needed.
}
returnbase.OnStart();
}
privatevoid ShowConfig(DiagnosticMonitorConfiguration config)
{
try
{
if (null == config)
{
Trace.WriteLine("Null configuration passed to ShowConfig");
return;
}
// Display the general settings of the configuration
Trace.WriteLine("*** General configuration settings ***");
Trace.WriteLine("Config change poll interval: " + config.ConfigurationChangePollInterval.ToString());
Trace.WriteLine("Overall quota in MB: " + config.OverallQuotaInMB);
// Display the diagnostic infrastructure logs
Trace.WriteLine("*** Diagnostic infrastructure settings ***");
Trace.WriteLine("DiagnosticInfrastructureLogs buffer quota in MB: " + config.DiagnosticInfrastructureLogs.BufferQuotaInMB);
Trace.WriteLine("DiagnosticInfrastructureLogs scheduled transfer log filter: " + config.DiagnosticInfrastructureLogs.ScheduledTransferLogLevelFilter);
Trace.WriteLine("DiagnosticInfrastructureLogs transfer period: " + config.DiagnosticInfrastructureLogs.ScheduledTransferPeriod.ToString());
// List the Logs info
Trace.WriteLine("*** Logs configuration settings ***");
Trace.WriteLine("Logs buffer quota in MB: " + config.Logs.BufferQuotaInMB);
Trace.WriteLine("Logs scheduled transfer log level filter: " + config.Logs.ScheduledTransferLogLevelFilter);
Trace.WriteLine("Logs transfer period: " + config.Logs.ScheduledTransferPeriod.ToString());
// List the Directories info
Trace.WriteLine("*** Directories configuration settings ***");
Trace.WriteLine("Directories buffer quota in MB: " + config.Directories.BufferQuotaInMB);
Trace.WriteLine("Directories scheduled transfer period: " + config.Directories.ScheduledTransferPeriod.ToString());
int count = config.Directories.DataSources.Count, index;
if (0 == count)
{
Trace.WriteLine("No data sources for Directories");
}
else
{
for (index = 0; index < count; index++)
{
Trace.WriteLine("Directories configuration data source:");
Trace.WriteLine("\tContainer: " + config.Directories.DataSources[index].Container);
Trace.WriteLine("\tDirectory quota in MB: " + config.Directories.DataSources[index].DirectoryQuotaInMB);
Trace.WriteLine("\tPath: " + config.Directories.DataSources[index].Path);
Trace.WriteLine("");
}
}
// List the event log info
Trace.WriteLine("*** Event log configuration settings ***");
Trace.WriteLine("Event log buffer quota in MB: " + config.WindowsEventLog.BufferQuotaInMB);
count = config.WindowsEventLog.DataSources.Count;
if (0 == count)
{
Trace.WriteLine("No data sources for event log");
}
else
{
for (index = 0; index < count; index++)
{
Trace.WriteLine("Event log configuration data source:" + config.WindowsEventLog.DataSources[index]);
}
}
Trace.WriteLine("Event log scheduled transfer log level filter: " + config.WindowsEventLog.ScheduledTransferLogLevelFilter);
Trace.WriteLine("Event log scheduled transfer period: " + config.WindowsEventLog.ScheduledTransferPeriod.ToString());
// List the performance counter info
Trace.WriteLine("*** Performance counter configuration settings ***");
Trace.WriteLine("Performance counter buffer quota in MB: " + config.PerformanceCounters.BufferQuotaInMB);
Trace.WriteLine("Performance counter scheduled transfer period: " + config.PerformanceCounters.ScheduledTransferPeriod.ToString());
count = config.PerformanceCounters.DataSources.Count;
if (0 == count)
{
Trace.WriteLine("No data sources for PerformanceCounters");
}
else
{
for (index = 0; index < count; index++)
{
Trace.WriteLine("PerformanceCounters configuration data source:");
Trace.WriteLine("\tCounterSpecifier: " + config.PerformanceCounters.DataSources[index].CounterSpecifier);
Trace.WriteLine("\tSampleRate: " + config.PerformanceCounters.DataSources[index].SampleRate.ToString());
Trace.WriteLine("");
}
}
}
catch (Exception e)
{
Trace.WriteLine("Exception during ShowConfig: " + e.ToString());
// Take other action as needed.
}
}
}
}