>hier besorgen
Das braucht man noch für Vista SP 1:
- Windows Azure Software Development Kit
- KB967631 - Update for Visual Studio 2008 SP1 Debugger
- Update: Das FastCGI-Modul
Bei IIS muss man dann noch über Systemstuerung->Programme-> Windows Funktionen ein-/auschalten die Funktionen ASP.NET und CGI in Internetinformationsdienste/WWW-Dienste/Anwendungsentwicklungsfeatures aktivieren.
Ggf. noch das Visual Studio Service Pack 1
Was einem dann auffällt, ist die seltsame Mischung der Sprachen C# / VB.Net (:-() bei dem Demoprojekt Guestbook. Habe deshalb mal den Worker - einer der Rollen innerhalb eines Cloud-Projekts - in C# umgeschrieben:
// Comment
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
using Microsoft.WindowsAzure.Diagnostics;
using Microsoft.WindowsAzure.ServiceRuntime;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.StorageClient;
using System.IO;
using GuestBook_Data;
using System.Drawing;
namespace GuestBook_WorkerRole
{
public class WorkerRole : RoleEntryPoint
{
private CloudQueue queue;
private CloudBlobContainer container;
public override void Run()
{
// This is a sample worker implementation. Replace with your logic.
Trace.TraceInformation("Listening for queue messages...");
while (true)
{
try
{
CloudQueueMessage msg = queue.GetMessage();
if (msg != null)
{
var messageParts = msg.AsString.Split(',');
var uri = messageParts[0];
var partitionKey = messageParts[1];
var rowkey = messageParts[2];
Trace.TraceInformation("Processing image in blob '{0}'.", uri);
CloudBlockBlob imageBlob = container.GetBlockBlobReference(uri);
MemoryStream image = new MemoryStream();
imageBlob.DownloadToStream(image);
image.Seek(0, SeekOrigin.Begin);
String thumbnailUri = String.Concat(Path.GetFileNameWithoutExtension(uri), "_thumb.jpg");
CloudBlockBlob thumbnailBlob = container.GetBlockBlobReference(thumbnailUri);
thumbnailBlob.UploadFromStream(CreateThumbnail(image));
GuestBookEntryDataSource ds = new GuestBookEntryDataSource();
ds.UpdateImageThumbnail(partitionKey, rowkey, thumbnailBlob.Uri.AbsoluteUri);
queue.DeleteMessage(msg);
Trace.TraceInformation("Generated thumbnail in blob '{0}'.", thumbnailBlob.Uri);
}
else
{
System.Threading.Thread.Sleep(1000);
}
}
catch (StorageClientException e)
{
Trace.TraceError("Exception when processing queue item. Message: '{0}'", e.Message);
System.Threading.Thread.Sleep(5000);
}
}
}
public override bool OnStart()
{
// Set the maximum number of concurrent connections
ServicePointManager.DefaultConnectionLimit = 12;
DiagnosticMonitor.Start("DiagnosticsConnectionString");
// For information on handling configuration changes
// see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.
RoleEnvironment.Changing += RoleEnvironmentChanging;
Microsoft.WindowsAzure.CloudStorageAccount.SetConfigurationSettingPublisher((configName, configSetter) =>
{
configSetter(Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.GetConfigurationSettingValue(configName));
});
var storageAccount = CloudStorageAccount.FromConfigurationSetting("DataConnectionString");
var blobStorage = storageAccount.CreateCloudBlobClient();
container = blobStorage.GetContainerReference("guestbookpics");
var queueStorage = storageAccount.CreateCloudQueueClient();
queue = queueStorage.GetQueueReference("guestthumbs");
Trace.TraceInformation("Creating container and queue...");
var storageInitialized = false;
do
{
try
{
container.CreateIfNotExist();
var permissions = container.GetPermissions();
permissions.PublicAccess = BlobContainerPublicAccessType.Container;
container.SetPermissions(permissions);
queue.CreateIfNotExist();
storageInitialized = true;
}
catch (StorageClientException e)
{
if (e.ErrorCode == StorageErrorCode.TransportError)
{
Trace.TraceError("Storage services initialization failure. "
+ "Check your storage account configuration settings. If unning locally, "
+ "ensure that the Development Storage service is running. Message: '{0}'", e.Message);
System.Threading.Thread.Sleep(5000);
}
else
throw;
}
} while (!storageInitialized);
return base.OnStart();
}
private void RoleEnvironmentChanging(object sender, RoleEnvironmentChangingEventArgs e)
{
// If a configuration setting is changing
if (e.Changes.Any(change => change is RoleEnvironmentConfigurationSettingChange))
{
// Set e.Cancel to true to restart this role instance
e.Cancel = true;
}
}
private Stream CreateThumbnail(Stream input)
{
Bitmap orig = new Bitmap(input);
int width;
int height;
if (orig.Width > orig.Height)
{
width = 128;
height = 128 * orig.Height / orig.Width;
}
else
{
height = 128;
width = 128 * orig.Width / orig.Height;
}
Bitmap thumb = new Bitmap(width, height);
using (Graphics graphic = Graphics.FromImage(thumb))
{
graphic.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
graphic.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
graphic.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
graphic.DrawImage(orig, 0, 0, width, height);
MemoryStream ms = new MemoryStream();
thumb.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
ms.Seek(0, SeekOrigin.Begin);
return ms;
}
}
}
}
Keine Kommentare:
Kommentar veröffentlichen