API REST Html-Helppage display Json requestsample

Für mein aktuelles API Projekt erstelle ich eigene Helppages auf denen ich auch Requestbeispiele für Xml und Json anzeige. Die Erstellung eines Request-Beispiel wird durch Xsd erstellt und das resultierende Xml wird dann durch Json.NET in Json konvertiert. Der Aufruf dazu sah wie folgt aus: var jsonSample = JsonConvert.SerializeXNode(xmlSampelRequest); Als Ergebnis wurde auch Json ausgebeben, leider aber ohne Zeilenumbrüche, was die Darstellung und Lesbarkeit doch stark reduziert. Damit der Json-String auch "vernüftig" formatiert wird, kann man bei der Serializierung noch einen Parameter setzen und damit die Formatierung erzwingen: Formatting.Indented Der Aufruf sieht dann wie folgt aus: var jsonSample = JsonConvert.SerializeXNode(xmlSampelRequest, Newtonsoft.Json.Formatting.Indented);

Automapper custom TypeConverter Exceptionhandling

In einem Projekt verwende ich aktuell die Komponente AutoMapper (automapper.codeplex.com), im zwischen den externen Datacontracts und den internen Entities zu mappen. Teilweise habe ich dafür auch eigenen TypeConverter entwickelt. Wenn man in diesem TypeConverter eine eigene Exception auslöst, dann erhält man beim aufrufenden Code immer eine AutoMapperMappingException.Da ich in dem Projekt ein globales ErrorHandling habe (WCF bzw. Implementierung vom IErrorHandler), möchte ich aber die konkrete Exception gerne aus dem TypeConverter in mein Errorhandling weitergeben. Damit das funktioniert baut man sich am besten einen Wrapper für den Aufruf vom Automapper, um dort zu entscheiden, welche Exception man weitergeben möchte. Die eigene Exception wird als InnerException vom AutoMapperMappingException mitgeliefiert. Durch überprüfung der InnerException kann man als feststellen, wie die aktuelle Exception zu bahandeln ist.Hier ein Beispiel: public class AutoMapperWrapper { public static U Map<T, U>( T source) { try { return Mapper.Map<T, U>(source); } catch (Exception e) { while (e is AutoMapperMappingException) e = e.InnerException; if (e == null) throw; else throw e; } } }

WCF OperationContract nicht optionale Prameter im Wsdl

Wenn man mit der WCF einen Service definiert und dabei Nachrichtenbasiert kommunizieren möchte, sieht kann die Definition z.B. so aussehen:[ServiceContract(Namespace = APICommon.DefaultSOAPNameSpace)]public interface ICartSoapService{ [OperationContract] ProcessCartResponse ProcessCart(ProcessCartRequest request);}[DataContract]public class ProcessCartRequest{ [DataMember(IsRequired = true)] public Cart Cart { get; set; }}[DataContract]public class ProcessCartResponse : BaseResponseMessage{ [DataMember(IsRequired = true)] public ProcessResultType ProcessResult { get; set; }}Die WCF erzeugt auch brav eine passendes Wsdl Datei für diese Beschreibung. Allerdings hat die "Standardausgabe" der WCF datei den Nachteil, das der Parameter "request" der Methode ProcessCart immer optionaler Parameter ist bzw. in der Wsdl Datei wird das Element mit den Attribute minOccurs="0" gekennezichnet. Da ohne den Parameter die Methode aber nicht vernüftig abgearbeitet werden kann, müsste im Wsdl eigentlich ein minOccurs="1" stehen ...also kein optionaler Parameter. Leider gibt es bei den Standardattributen der WCF keine Möglichkeit, diese Verhalten oder viel mehr die Wsdl-Generierung zu beinflussen. Trotzdem kann man durch ein eigenes Attribute das gewünschte Verhalten sehr schnell der WCF beibringen.Dafür muss man lediglich ein Attribute anlegen und die Interfaces IContractBehavior + IWsdlExportExtension mit hinzufügen. Die vollständige Implementierung sieht so aus: [AttributeUsage(AttributeTargets.Interface)] public class OperationsParametersAreRequiredAttribute : Attribute, IContractBehavior, IWsdlExportExtension { private List<RequiredOperationParameter> _requiredOperationParameters; public void AddBindingParameters( ContractDescription contractDescription, ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters) { } public void ApplyClientBehavior( ContractDescription contractDescription, ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime) { } public void ApplyDispatchBehavior( ContractDescription contractDescription, ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.DispatchRuntime dispatchRuntime) { } public void ExportContract( WsdlExporter exporter, WsdlContractConversionContext context) { if (_requiredOperationParameters == null) _requiredOperationParameters = new List<RequiredOperationParameter>(); foreach (var operation in context.Contract.Operations) { var requestMessage = operation.Messages.Where(m => m.Direction == MessageDirection.Input).FirstOrDefault(); var parameters = operation.SyncMethod.GetParameters(); Debug.Assert(parameters.Length == requestMessage.Body.Parts.Count); for (var iLoop = 0; iLoop < parameters.Length; iLoop++) { var attributes = parameters[iLoop].GetCustomAttributes( typeof(OperationParameterIsOptionalAttribute), false); if (attributes.Length == 0) { _requiredOperationParameters.Add(new RequiredOperationParameter { Namespace = requestMessage.Body.Parts[iLoop].Namespace, Name = requestMessage.Body.Parts[iLoop].Name, Message = operation.Name }); } } } } public void ExportEndpoint( WsdlExporter exporter, WsdlEndpointConversionContext context) { foreach (var requiredParamter in _requiredOperationParameters) { var schemas = exporter.GeneratedXmlSchemas.Schemas(requiredParamter.Namespace); foreach (XmlSchema schema in schemas) { var message = schema.Elements[requiredParamter.XmlName] as XmlSchemaElement; var complexType = message.ElementSchemaType as XmlSchemaComplexType; var sequence = complexType.Particle as XmlSchemaSequence; foreach (XmlSchemaElement schemaElement in sequence.Items) { if (schemaElement.Name == requiredParamter.Name) { schemaElement.MinOccurs = 1; schemaElement.MinOccursString = "1"; break; } } } } _requiredOperationParameters.Clear(); } public void Validate( ContractDescription contractDescription, ServiceEndpoint endpoint) { } internal class RequiredOperationParameter { public string Message { get; set; } public string Name { get; set; } public string Namespace { get;set;} public XmlQualifiedName XmlName { get { return new XmlQualifiedName(Message, Namespace); } } } }

WCF REST Could not load file or assembly 'System.ServiceModel.Activation'

Bei dem Versuch HTTP Basic Auth für einen REST Dienst zu implementieren (der wiederrum durch Konfiguration per serviceActivations in der .config und eigenere factory gestartet wird) bekam ich die Fehlermeldung bei der Umstellung vom Attribute aspNetCompatibilityEnabled von "false" auf "true"  das die Assembly 'System.ServiceModel.Activation' nicht gefunden werden konnte. Hier die genaue Fehlermeldung: System.IO.FileNotFoundException: Could not load file or assembly 'System.ServiceModel.Activation' or one of its dependencies. The system cannot find the file specified.File name: 'System.ServiceModel.Activation'   at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMarkHandle stackMark, Boolean loadTypeFromPartialName, ObjectHandleOnStack type)   at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark, Boolean loadTypeFromPartialName)   at System.Type.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase)   at System.Web.Compilation.BuildManager.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase)   at System.Web.Configuration.HandlerFactoryCache.GetTypeWithAssert(String type)   at System.Web.Configuration.HandlerFactoryCache.GetHandlerType(String type)   at System.Web.Configuration.HandlerFactoryCache..ctor(String type)   at System.Web.HttpApplication.GetFactory(String type)   at System.Web.HttpApplication.MaterializeHandlerExecutionStep.System.Web.                        HttpApplication.IExecutionStep.Execute()   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)=== Pre-bind state information ===LOG: User = userLOG: DisplayName = System.ServiceModel.Activation (Partial)WRN: Partial binding information was supplied for an assembly:WRN: Assembly Name: System.ServiceModel.Activation | Domain ID: 2WRN: A partial bind occurs when only part of the assembly display name is provided.WRN: This might result in the binder loading an incorrect assembly.WRN: It is recommended to provide a fully specified textual identity for the assembly,WRN: that consists of the simple name, version, culture, and public key token.WRN: See whitepaper http://go.microsoft.com/fwlink/?LinkId=109270 for more information and common solutions to this issue.LOG: Appbase = file:///xxxxx/LOG: Initial PrivatePath xxxx\binCalling assembly : (Unknown).===LOG: This bind starts in default load context.LOG: Using application configuration file: xxxx\web.configLOG: Using host configuration file: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet.configLOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/Temporary ASP.NET Files/root/3d7bd35f/452e5631/System.ServiceModel.Activation.DLL.LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/Temporary ASP.NET Files/root/3d7bd35f/452e5631/System.ServiceModel.Activation/System.ServiceModel.Activation.DLL.LOG: Attempting download of new URL file:///xxxx/bin/System.ServiceModel.Activation.DLL.LOG: Attempting download of new URL file:///Dxxxx/bin/System.ServiceModel.Activation/System.ServiceModel.Activation.DLL.LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/Temporary ASP.NET Files/root/3d7bd35f/452e5631/System.ServiceModel.Activation.EXE.LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/Temporary ASP.NET Files/root/3d7bd35f/452e5631/System.ServiceModel.Activation/System.ServiceModel.Activation.EXE.LOG: Attempting download of new URL file:///xxxx/bin/System.ServiceModel.Activation.EXE.LOG: Attempting download of new URL file:///xxxxx/bin/System.ServiceModel.Activation/System.ServiceModel.Activation.EXE. - Thread: 15Das Problem liegt an einem Eintrag in der web.config, denn dort hatte ich unter system.webserver -> handlers folgenden Eintrag hinzugefügt:<add name="svc" path="*.svc" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation"/>Nach dem Ändern bzw. Ergänzen diesers Eintrages: <add name="svc" path="*.svc" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory,System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />Funktioniert auch wieder die Aktivierung vom WCF basierten REST Service.

WCF Http API REST XML Custom ErrorHandler

Im Augenblick entwickel ich eine Architektur für eine WEB-API basierend auf der WCF. Als Grundlage habe ich das WCF Http Projekt (das auf Codeplex zu finde ist) genommen. Mir gefällt dort insbesondere der Ansatz der MediaTypeProcessor, womit sich die Request- und Response-Formate sehr schön beeinflussen lassen.Ein wichtier Aspekt bei jeder Architektur ist das Thema Exceptionhandling. Leider gibt es für das oben genannte Projekt noch keinen eigenen Exceptionhandler, der auch die MediaTypeProcessors nutzt, um eine Exception im angeforderten Format zurück zu geben. Das kann z.B. XML, Json aber theoretisch auch ein Bild oder Wav Dateien sein. Daher habe ich heute mal einen Exceptionhandler geschrieben, der mit dem Projekt zusammenarbeitet. Als Basis wird hierbei natürlich das Interface der WCF IErrorHandler genutzt und eine generelle Basisimplementierung aus dem Projekt.Ich bin noch nicht 100% glücklich mit der Lösung aber im Augenblick funktioniert das so ganz gut. Werde die Implementierung auch auf Codeplex posten und hoffe dort vielleicht weitern Input zu finden. Aber auch per E-Mail freue ich mich über konstruktive Beiträge!Here we go: public class RESTMessageErrorHandler : HttpMessageErrorHandler, IErrorHandler { // Public Methods #region HandleError public override bool HandleError( Exception error) { Logging.Error("API Exception", error); return true; } #endregion // Protected Methods #region ProvideResponse protected override void ProvideResponse( Exception exception, Microsoft.Http.HttpResponseMessage response) { APIBaseException apiException = null; if (exception is APIBaseException) apiException = exception as APIBaseException; else apiException = new APIBaseException(System.Net.HttpStatusCode.InternalServerError,  "An error has occured processing your request."); var supportedMediaTypes = new List<string>(); var httpMessageProperty = OperationContext.Current. IncomingMessageProperties[HttpMessageProperty.Name] as HttpMessageProperty; var httpRequest = httpMessageProperty.Request as HttpRequestMessage; var contentType = httpRequest.Headers.ContentType; var uriMatch = httpRequest.Properties.First( p => p.GetType() == typeof(UriTemplateMatch)) as UriTemplateMatch; var endpoint = OperationContext.Current.Host.Description.Endpoints.Find( OperationContext.Current.EndpointDispatcher.EndpointAddress.Uri); var dispatchOperation = OperationContext.Current.EndpointDispatcher.DispatchRuntime. Operations.Where(op => op.Name == uriMatch.Data).First(); var operationDescription = endpoint.Contract.Operations.Find(dispatchOperation.Name); //get the contenttype of the request var httpBehavoir = endpoint.Behaviors.Find<HttpEndpointBehavior>(); var processors = httpBehavoir.GetResponseProcessors( operationDescription.ToHttpOperationDescription()).ToList<Processor>(); //Fallback for empty contenttype if (string.IsNullOrEmpty(contentType)) { foreach (var processor in processors) { var mediaTypeProcessor = processor as MediaTypeProcessor; if (mediaTypeProcessor == null) continue; supportedMediaTypes.AddRange(mediaTypeProcessor.SupportedMediaTypes); } contentType = ContentNegotiationHelper.GetBestMatch(httpRequest.Headers.Accept.ToString(),  supportedMediaTypes).MediaType; if (string.IsNullOrEmpty(contentType)) contentType = "text/plain"; } //set http-header and status code response.Headers.ContentType = contentType; response.StatusCode = apiException.Status; //search processor for the output-serialization foreach (var processor in processors) { var mediaTypeProcessor = processor as MediaTypeProcessor; if (mediaTypeProcessor == null) continue; if (mediaTypeProcessor.SupportedMediaTypes.Contains<string>(contentType)) { response.Content = HttpContent.Create(s => mediaTypeProcessor. WriteToStream(new APIExceptionContract(apiException), s, httpRequest)); break; } } //if no processor found use plain text if (response.Content == null) response.Content = HttpContent.Create(apiException.Description); } #endregion }

WCF URL Rewriting entfernen der Endung "svc"

Bei dem Standardverhalten, wenn ein WCF Service über den IIS veröffentlicht wird ist, dass der Endpunkt die Datei von Service ist mit der Dateiendung ".svc". Dieses sieht aber - gerade im Bezug auf ein REST-basiertes System nicht besonders elegant aus. Bei dem Einsatz von IIS 7.0 ist es sehr einfach die Dateiendung zu entfernen, ohne dabei viel Code zu schreiben. Für das URL Rewriting gibt eine Erweiterung, die man dem IIS 7.0 hinzufügen kann. Dadurch ist es sehr schön möglich z.B. über Regular Expressions ein URL Rewriting durchzuführen. Nach der Installation dieser Erweiterung muss nur noch folgende Regel definiert werden:1. Name: Entfernen der Dateiendung svc2. Request URL: Matches the pattern3. Using: Regular Expressions4. Pattern: ^([0-9a-zA-Z\-]+)/([0-9a-zA-Z\-\.\/\(\)]+) 5. Ignore Cases: true6. Action Type: Rewrite7. Rewrite URL: {R:1}.svc/{R:2}8. Append Querystring: trueFertig ;-)Per Eintrag in der web.config sieht das dann alternativ so aus:  <system.webServer>    <modules runAllManagedModulesForAllRequests="true" />        <rewrite>            <rules>                <rule name="Remove Svc Extension">                    <match url="^([0-9a-zA-Z\-]+)/([0-9a-zA-Z\-\.\/\(\)]+)" />                    <action type="Rewrite" url="{R:1}.svc/{R:2}" />                </rule>            </rules>        </rewrite>  </system.webServer>

WCF WSDL replace http://tempuri.org

Jeder Webservice sollte einen eindeutigen Namespace verwenden, um im Web auf jeden Fall eindeutig zu sein. Als Standardnamespace wird von ASP.NET Webservices (und auch von der WCF) folgender Namespace verwendet: http://tempuri.orgDieses sollte als erstes modifiziert werden, damit man erst gar nicht mit einem solchen Namespace online geht.Das Problem bei der WCF ist nun leider, dass der Namespace an drei verschiedenen Stellen angegeben werden muss, damit auch im WSDL der gewünschte Namespace durchgängig verwendet wird.Als erstes muss man dem Namespace beim der Servicebeschreibung dem [ServiceContract] angeben:[ServiceContract(Namespace = "http://dotnetnukeblog.de")] public interface IPostServiceDie zweite Stelle ist bei der Serviceimplementierung:[ServiceBehavior(Namespace = "http://dotnetnukeblog.de")] class PostService : IPostService Die letzte Stelle ist bei der Konfiguration des Endpoints mit dem Attribute bindingNamespace:<endpoint binding="basicHttpBinding" bindingNamespace="http://dotnetnukeblog.de".... Erst wenn an allen drei Stellen der Namespace gesetzt wurde, wird dieser auch durchgängig bei der WSDL Erzeugung genutzt.

WCF, IIS and 404.3 Errors

Nachdem ich an einem jungfräulichen Rechner sitze und gerade einen WCF Service debuggen wolte, bekam ich ständig vom IIS den Fehlercode 404.3. Schnell habe ich herausgefunden das die verwendete Endung ".svc" nicht einem Handler zugeordnet ist. Um dieses aber nicht manuel machen zu müssen gibt es bei der WCF ein Tool, dass die Registrierung übernimmt. Das Tool findet man unter %Windows%\Microsoft.Net\Framework\v3.0\Windows Communication Foundation\ und heißt ServiceModelReg.exe. Das muss mit dem Parameter "-i" aufgerufen werden und anschließend funktioniert auch das Hosting im IIS.

Social Networks Publishing-Dienst

Die Bedeutung Social Networks / Social Media (bzw. Soziale Netwerke) wächst im Augenblick fast täglich. Twitter, Facebook, StudiVZ als Netzwerke aber auch die Social Bookmark Dienste von Google, Microsoft Live, etc. werden deutlich mehr genutzt. Diese Netzwerke werden nicht nur von Kindern und Computergeeks genutzt sondern auch von vielen Firmen, um darüber den Geschäftserfolg zu steigern. Wer nicht in den meisten Netzwerken vertreten ist, vergibt sich unter Umständen jede Menge Chancen. Jetzt kann es aber sehr Aufwendig sein, alle Netzwerke immer mit den Inhalten zu füllen – dabei lässt sich das wirklich gut automatisieren, da viele von den Social Networks  (z.B. Twitter) eine API anbieten um Inhalte von externen Tools zu publizieren.Mittlerweile gibt es bereits einige Dienste im Internet, die in der Lage sind verschiedene Netzwerke mit einem Tool zu bedienen. Für meinen Teil habe ich mich entschieden eine eigene Anwendung zu schreiben – nein, nicht aus wirtschaftlichen Gründen sonder einfach weil ich Spaß daran habe – also keine Diskussionen bitte warum ich das Rad noch mal erfinden .. ich hab gerade Spaß dran ;-)Derzeit plane ich ein Publishing-Dienst mit der WCF (Microsoft Windows Communication Foundation) zu erstellen, der über eine universelle Schnittstelle gefüttert werden kann, um dann schließend die Nachrichten in den angegebenen Netzwerken zeitgesteuert zu veröffentlichen. Zur Entkopplung zwischen der universellen Schnittstelle und dem eigentlichen Dienst kommt nach Planung eine Message Queue (MsMq) zum Einsatz, damit die Schnittstelle unabhängig von Dienst zur Verfügung steht um Nachrichten im Empfang zu nehmen.Der eigentliche SocialMedia-Publishing-Dienst soll sich dann darum kümmern das die Nachrichten entsprechend es gewählten Netzwerks aufbereitet werden – z.B. die Länge der Nachricht, Verwendung von URLShorter-Diensten (TinyUrl), usw. Die benötigten Informationen bzw. Konfigurationen werden in einer Datenbank gespeichert, wo auch die einzelnen aufbereiteten Nachricht abgelegt werden. Ein Veröffentlichungsprotokoll rundet dann die Anwendung ab, damit man verfolgen kann, wann welche Nachricht veröffentlicht wurde oder eben warum nicht.Zur Verwaltung des Publishing-Dienst stelle ich mir aktuelle eine kleine ASP.NET MVC Anwendung vor…Wenn jemand noch gute Ideen hat, dann immer her damit :)

Ein Videoportal auf Basis von DotNetNuke, WCF und MS - Message Queue

Im Netz gibt es zwei Seiten mutlimedia.katholisch.de und www.kirche.tv. Beiden Seiten wurde mit DotNetNuke umgesetzt und sollen so eine Art YouTube darstellen. Natürlich sehr stark spezialisiert auf den Bereich der katholischen Kirche.Die Architektur von diesen Videoportalen ist recht interessant, da hier beide Portale (getrennte Installationen) aus einem gemeinsamen Datenpool bedient werden. Der Lösungsansatz ist DotNetNuke mit WCF zu verheiraten. Die Module zur Darstellung von Videos, zum Upload von Videos und natürlich die Administration von Videos greifen dann nicht wie sonst üblich auf den DataProvider zurück, sonder befragen einfach die laufenden WCF-Services. Die eigentlich "anzeige Module"  - sprich die *.ascx" - greifen aber wie gewohnt auf Controller-Klassen zu, durch die dann eine Kommunikation mit den WCF-Services ermöglicht wird. In den Controllern kann man dann z.B. auch Caching und ähnliches einbauen. Neben der WCF wurde auch die MSMQ (Message Queue) stark genutzt, was gerade im Zusammenspiel mit der WCF sehr viel freude bereitet und denkbar einfach ist. Der große Vorteil bei der Verwendung von MSMQ ist natürlich, dass Prozesse asynchron ablaufen können und der Benutzer nicht warten muss, bis der komplette Workflow-Prozess dahinter abgerabeitet ist. Ein kurzes Beispiel um das zu verdeutlichen: Ein Anwender macht einen Video - Upload durch das DNN-Modul; dieses macht eine erste Validierung der Daten und wenn diese in Ordnung sind, wird eine Nachricht mit allen Informationen in eine transaktionale Message Queue übertragen. Damit ist der Job für das DNN-Modul zunächst erledigt. Ein WCF-Service der permanent die Queue "im Auge" hat, holt die Nachricht ab und bearbeitet diese nun weiter - Daten werden in die Datenbank geschrieben, eine Nachricht zur Konvertierungs Queue abgesetzt, etc.). Gerade bei der Konvertierung von Videos kommt man um einen asynchron Verarbeitung nicht herum, da große Dateien längere Zeit in anspruch nehmen,. Die Konvertierung erfolgt übrigens in das Format Flash. Wenn das Video konvertiert wurde, wertet ein diesmal ei NT-Dienst das Ergebnis aus und berichtet den Status. Für die Konvertierung werden externe Programm eingesetzt und deshalb überwacht das ein NT-Dienst. [Dieser Workflow ist nur sehr grob beschrieben und beinhaltet noch deutlich mehr Schritte]Die beiden Portale laufen nun seit gut 6 Monaten sehr zuverlässig, stabil und schnell. Ein schöner Beweis das man mit DotNetNuke als Basis wirklich so ziemlich alles umsetzen kann und das man DotNetNuke auch wunderbar mit anderen Technologien nutzen kann.Wer ausführlichere Informationen dazu haben möchte, kann sehr gerne mit mir Kontakt aufnehmen...

DotNetNuke 4.7.0 steht als Download bereit

Also zunächst mal: Ich lebe noch ;-) Auch wenn mein Blog in den letzten Wochen eigentlich etwas anderes vermuten läßt. In den letzten Woche stecke ich in einem größeren Projekt wo ich DotNetNuke und die WCF (Windows Communication Foundation) mit einander kombiniert habe, um ein Videoportal (so in Richtung youtube, myvideo, etc.) zu entwicken. Doch dazu später hoffentlich mehr.... Seit heut steht DotNetNuke 4.7.0 zur Verfügung und wurde für die Öffentlichkeit als Download bereit gestellt. Dieses wurde pünktlich zur US-Konferenz OpenForce'07 bekannt gegeben. Dabei finde die neuen benutzerfreundlichen URLs sehr spannend. Leider komme ich im Augenblick noch nicht dazu, diese zu testen. :(  

Enterprise Library 3.0 steht zum Download bereit

Die von mir gern benutze und geschätzte Enterprise Library steht nun endlich in der Version 3.0 als Download zur Verfügung. Folgende Application Blocks sind in dem Download-File enthalten: Caching Application Block Cryptography Application Block Data Access Application Block Exception Handling Application Block Logging Application Block Policy Injection Application Block Security Application Block Validation Application Block Ebenso wurde die Integration der Windows Communication Foundation (WCF) vorgenommen. Leider ist meine Zeit im Augenblick etwas knapp aber ich hoffe mir die Finale der Library bald genauer anschauen zu können. Download Enterprise Library 3.0  

Sicherheitsanalyse von WCF (Windows Communication Foundation) durch das BSI und newtelligence

Wie ich schon in meinem Beitrag über den NRW Sumit 06 geschrieben haben, hat Newtelligence eine Beispielanwendung für die WCF geschrieben. Diese Anwendung wurde im Auftrag des BSI (Bundesamt für Sicherheit in der Informationstechnik) entwickelt und sollte nicht nur ein praxisorientierte Beispielanwendung sondern viel mehr die sichere Nutzung der WCF-Sicherheitsfunktionen zeigen.Die Empfehlungen umfassen neben den Hinweisen zu WCF-spezifischen Architekturen, zur sicheren Installation, Authentisierung und zur Anbindung von Datenbanken oder der Fehlerbehandlung in verteilten Systemen auch auch den Quellcode der beispielhaften WCF-Anwendung. Die entwickelten Handlungsempfehlungen sowie die Beispielanwendung kann per E-Mail (security (at) bsi.bund.de) angefordert werden.

Endlich neuer IE / .NET Framework 3.0 ready to download

Vermutlich ist es kein großes Geheimnis mehr aber trotzdem verbreite ich die Neuigkeit auch mal: Microsoft hat den Internet Explorer 7.0 zum Download frei gegeben. Der neue IE ist nicht nur ein Featureupdate sondern laut Aussage von Microsoft ein von Grund auf komplettes Redesign.  Besonders die Punkte Bedienbarkeit und Sicherheit standen im Vordergrund der Entwicklung. Hier gibt es den neuen Browser:Download   Endlich ist es da: Das .NET Framework 3.0 inkl. der passenden SDK's und den passenden Erweiterungen für das Visualstudio 2005. Ein paar Informationen zum .NET Framework und der Installation gibt es hier. Hier die Downloadlinks für die einzelnen Downloads: net 3.0 runtime -> http://www.microsoft.com/downloads/details.aspx?FamilyId=10CC340B-F857-4A14-83F5-25634C3BF043&displaylang=en sdk -> http://www.microsoft.com/downloads/info.aspx?na=40&p=3&SrcDisplayLang=en&SrcCategoryId=&SrcFamilyId=10CC340B-F857-4A14-83F5-25634C3BF043&u=http%3a%2f%2fgo.microsoft.com%2ffwlink%2f%3fLinkId%3d74726 visual studio extensions for WF -> http://www.microsoft.com/downloads/info.aspx?na=40&p=4&SrcDisplayLang=en&SrcCategoryId=&SrcFamilyId=10CC340B-F857-4A14-83F5-25634C3BF043&u=http%3a%2f%2fgo.microsoft.com%2ffwlink%2f%3fLinkId%3d74727 visual studio extensions for WCF, WPF (noch CTP !1) -> http://www.microsoft.com/downloads/info.aspx?na=40&p=2&SrcDisplayLang=en&SrcCategoryId=&SrcFamilyId=10CC340B-F857-4A14-83F5-25634C3BF043&u=http%3a%2f%2fgo.microsoft.com%2ffwlink%2f%3fLinkId%3d74725

Techtalk Indigo / WCF mit Christian Weyer

Gestern abend war ich mal wieder auf einem Techtalk zum Thema: "Teile und herrsche: Verteilte Lösungen mit der Windows Communication Foundation" Hier bot Christian Weyer eine echt klasse "Show" und vermittelte eine sehr gute Einführung in das Thema SO (ohne "a") und WCF. Dabei wurden den Zuhöreren aber keine Slides um die Köpfe geschmießen, sondern Christian arbeitet mit Flipcharts und vielen Code-Beispielen. Man konnte das erzählte meist direkt in der Praxis sehen und somit vielfach deutlich schneller verstehen. Ende des Jahres gibt es eine weiter Beispielanwendung TecTv, das viele Bereiche des neuen .NET Frameworks 3.0 zeig... also WCF, WPF, WWF. Darauf darf man gespannt sein.