Laden...

Forenbeiträge von Wax Ingesamt 731 Beiträge

26.06.2023 - 08:40 Uhr

Guten Tag,

ich setze SignalR in einer ASP.NET Core 6 Anwendung ein. Zur Authentifizierung einer neuen Connection wird KeyCloak verwendet.

Wenn ich nun vom Client aus eine Connection zum Hub aufbauen möchte, dann funktioniert das mit dem KeyCloak AccessToken ohne Probleme. Wenn dieses Token nun aber abläuft, dann bleibt die SignalR-Verbindung aber trotzdem bestehen. Genau das möchte ich aber verhindern.

Ich habe nun gesehen, dass es eine erweiterte Option bei SignalR namens "CloseOnAuthenticationExpiration" gibt. Diese klingt so, als wäre sie genau das was ich brauche. Ich habe diesen Wert bei mir in der Testumgebung folgendermaßen gesetzt:

app.UseEndpoints(endpoints =>
    {
        endpoints.MapHub<v1.NotificationHub>("/v1/notificationHub", options =>
        {
            options.CloseOnAuthenticationExpiration = true;
        });
        endpoints.MapControllers();
    });

Leider wird die Connection nach Ablauf der Tokengültigkeit nicht geschlossen.

Hat vielleicht einer Erfahrung mit diesem Thema und kann mir sagen, welche zusätzlichen Dinge ich noch implementieren muss, damit diese Option greift?

09.12.2020 - 18:43 Uhr

@BerndFfm: Mit welchem "Scripting-Host" werden die Skripte denn geladen bzw. ausgeführt und unterstützt du das Laden von 3rd Party Libraries (durch Referenzen auf die Assemblies) oder muss sich das Skript da selbst drum kümmern?

09.12.2020 - 07:03 Uhr

@T-Virus: Aktuell wäre der Plan, zur Laufzeit an einer bestimmten Stelle im Code nach [BestimmterOrdner][BestimmterDateiname].cs zu suchen. Falls diese Datei existiert, sollte ein ScriptingHost die Datei laden und eine gewünschte (hoffentlich vorhandene Methode) ausführen.

Der Kunde könnte im Endeffekt selbst Hand anlegen und z.B. hauseigene Bibliotheken zur Ver-/Entschlüsselung von Inhalten zwischen schalten.

Das mit dem Scripting ist nur aufgekommen, da das Produktmanagement meint, es wäre für die Kunden bzw. unsere Consultants einfacher mal eben in einer kundenspezifischen Programmierung ein Skript anzupassen, anstatt eine DLL zu kompilieren.

Ich selbst bin ein Freund der Plug-in Lösung. Allerdings kann ich auch die Einfachheit der Skript-Lösung nachvollziehen.

08.12.2020 - 09:32 Uhr

Ich bin soeben über "CS-Script" gestolpert.
Das könnte mich schon ein ganzes Stück weiter bringen, wenn es hält was es verspricht.

Ich muss mir das mal anschauen...

07.12.2020 - 19:11 Uhr

Danke für die bisherigen Antworten!

@Abt: Bisher wurden diese Probleme tatsächlich mit VB-Script gelöst. Da gab es keine Assemblies die in App-Domains geladen werden und OOP bis ans Limit.

Da das Kernprodukt in C# entwickelt wurde und die meisten Entwickler innerhalb der Firma auch C# beherrschen, wollte man am liebsten in dieser Sprache bleiben.

Vielleicht ist der Ansatz aber auch einfach verkehrt. Ich versuche das ursprüngliche Problem mal zu schildern...

Innerhalb des C# Codes gibt es Stellen die, falls eine Implementierung für diese Stelle/Hook existiert, diese Implementierung dann auch durchlaufen werden soll. Quasi nach dem Motto: Wurde ein Handler für diesen Hook gefunden, dann rufe ihn auf und lass ihn arbeiten. Die Signaturen dieser "Erweiterungspunkte" wären wohl definiert und die Entwickler würden sich an die Konventionen halten und somit könnte die Hauptanwendung die Methode innerhalb des "Erweiterungsskriptes" finden und aufrufen. Leider sind diese "Erweiterungsskripte", wie immer, abhängig von anderen Assemblies.

Von daher sehe ich inzwischen eigentlich nur noch die Plug-in Lösung. Also die Entwickler sollen bitte sehr DLLs in nen bestimmten Ordner werfen und die Hauptanwendung scannt diese Ordner nach verwendbaren Modulen.

07.12.2020 - 14:06 Uhr

Ich muss wohl etwas weiter ausholen merke ich gerade....

Innerhalb des Skripts, sollen andere Entwickler ihren C# Code ausführen können, der wiederum auf andere 3rd Party Bibliotheken zurückgreifen muss.

Jetzt habe ich Ansätze wie die Roslyn Scripting API gesehen, die Code Zeile für Zeile ausführt.
Dadurch würden zur Laufzeit ja nicht automatisch die benötigten 3rd Party Assemblies geladen werden oder etwa doch?

Muss ich vielleicht doch lieber eine Assembly per AssemblyResolver als Plug-in laden und aufrufen anstatt ein Skript zu laden?

Die Skript Variante erschien mir Anfangs attraktiv, da so die anderen Entwickler für Anpassungen nicht immer erst eine Plug-in DLL kompilieren müssten, sondern den Skript-Code "mal eben" anpassen und sofort laufen lassen könnten.

07.12.2020 - 13:19 Uhr

Guten Tag,

ich schaue mich gerade nach einer Möglichkeit um, mit der ich zur Laufzeit ein externes C#-Skript (liegt im Dateisystem in einem zugreifbaren Ordner) laden und Methoden innerhalb dieses Skripts ausführen kann.

Also z.B. würde das Skript folgende Methode enthalten, die ich gerne zur Laufzeit aufrufen würde:


public Task<object> Execute(object parameter) {}

Nun finde ich Beiträge im Netz von 2010, in denen z.B. der Typ Microsoft.CSharp.CSharpCodeProvider verwendet wird um den Code zu laden und on-thy-fly zu kompilieren.

Ist es aktuell immer noch der Weg den man gehen sollte oder hat sich in der Zwischenzeit da etwas getan und ich würde auf das falsche, schlecht gealterte, Pferd setzen? Vielleicht gibt es inzwischen bessere (Standard-) Bibliotheken?

Gruß

24.01.2020 - 11:23 Uhr

Hallo zusammen,

ich möchte in meinem Setup Projekt in einer Custom Action den Inhalt einer (durch den Installer) installierten Datei lesen und verwenden. Wenn bei dieser Custom Action ein Fehler auftritt, möchte ich die komplette Installation des Produkts rückgängig machen, also das es später nicht unter den installierten Programmen erscheint.

Ich habe nun das Problem das ich den Inhalt der Datei erst nach dem "InstallFinalize" event von der Platte lesen kann und wenn ich nun die Custom-Action einen Fehler werfen lasse, hat das keine Auswirkung auf die Installation. Sprich, die Dateien bleiben an Ort und Stelle und es erscheint natürlich auch unter den installierten Programmen.

Laut Doku wird mein gewünschtes Verhalten anscheinend auch nicht unterstützt.

Nun hoffe ich auf viele pfiffige Entwickler, die es vielleicht doch irgendwie hinbekommen haben oder 'nen Workaround gefunden haben?

Gruß
wax

22.08.2018 - 16:29 Uhr

Bringt leider keine Besserung.

Hier nochmal die Auszüge aus der web.config Datei:


<behaviors>
    <endpointBehaviors>
        <behavior name="webServiceEndpointBehavior">
            <AuthenticationBehaviorExtensionElement />
            <FluentValidationBehaviorExtensionElement />
        </behavior>
    </endpointBehaviors>
    <serviceBehaviors>
        <behavior name="serviceBehavior">
            <serviceDebug includeExceptionDetailInFaults="true" />
            <serviceMetadata httpGetEnabled="true" />
        </behavior>
    </serviceBehaviors>
</behaviors>


<bindings>
    <basicHttpBinding>
        <binding name="http" textEncoding="utf-8">
            <security mode="TransportCredentialOnly">
                <message clientCredentialType="UserName" />
            </security>
        </binding>
    </basicHttpBinding>
</bindings>


<service name="FancyController" behaviorConfiguration="serviceBehavior">
    <endpoint name="fancy_httpEndpoint" behaviorConfiguration="webServiceEndpointBehavior" address="" binding="basicHttpBinding" bindingConfiguration="http" contract="IFancyControllerDTO" />
    <endpoint name="fancy_httpMetadataEndpoint" address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    <host>
        <baseAddresses>
            <add baseAddress="http://localhost:8082/Controllers/FancyController.svc"/>
        </baseAddresses>
    </host>
</service>

22.08.2018 - 15:05 Uhr

Eine http-Bindung wurde im IIS konfiguriert.
Der eigentliche Service-Endpoint verwendet binding="basicHttpBinding" und eine bindingConfiguration mit den http Security-Settings.

OT: Der Kunde will... 😁

Gruß
wax

22.08.2018 - 14:50 Uhr

Sorry für die fehlende Information.
Ja es handelt sich um einen per IIS (10) gehosteten Service.

Gruß
wax

22.08.2018 - 14:31 Uhr

Guten Tag,

ich habe einen WCF Service (gehostet auf einem IIS 10) und dieser stellt auch seine Metadaten mittels WSDL bereit.


<serviceBehaviors>
    <behavior name="serviceBehavior">
        <serviceMetadata httpsGetEnabled="true" httpGetEnabled="true" />
    </behavior>
</serviceBehaviors>

Die Security Settings für das basicHttpBinding sehen folgendermaßen aus:


<security mode="TransportWithMessageCredential">
    <message clientCredentialType="UserName" />
</security>

Mein Service hat folgenden Metadaten-Endpunkt konfiguriert:


<endpoint name="service_httpMetadataEndpoint" address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />

Das funktioniert über https wunderbar!

Nun zum Problem:
Jetzt würde ich aber gerne nur http verwenden (also ohne SSL).

Also setze ich httpsGetEnabled="false" und die Security-Settings auf:


<security mode="TransportCredentialOnly">
    <message clientCredentialType="UserName" />
</security>

Ich habe gehofft, dass mir trotzdem noch der http Zugang zur WSDL Definition bleibt, nur leider ist dem nicht so. Unter "myService.svc?wsdl" finde ich dann plötzlich nichts mehr.

Hat jemand eine Ahnung warum dann plötzlich kein ?wsdl Aufruf mehr möglich ist, obwohl httpGetEnabled="true" gesetzt ist. 🤔

edit: Es wird dann plötzlich nur noch diese URL vorgeschlagen: "http://[servername]/myService.svc/mex"

Gruß
wax

22.06.2018 - 06:07 Uhr

Ich habe es hinbekommen und es lag tatsächlich an der Art und Weise wie das SOAP-XML in SoapUI definiert wird. Wenn man in SoapUI ein Attachment hinzufügt, dann wird eine ContentID vergeben.

Und genau diese ContentID musste einfach gleich sein zu dem dazugehörigen PART Eintrag:


<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="www.tempuri.org" xmlns:bgp="http://schemas.datacontract.org/2004/07/WSController.Models">
   <soapenv:Header/>
   <soapenv:Body>
      <tem:UploadMultipartDocument>
         <!--Optional:-->
         <tem:multipartDocument>
            <bgp:Parts>
               <bgp:DocumentPart>
                  <bgp:Name>part1.xml</bgp:Name>
                  <bgp:PartData>cid:part1.xml</bgp:PartData>
               </bgp:DocumentPart>
               <bgp:DocumentPart>
                  <bgp:Name>part2.xml</bgp:Name>
                  <bgp:PartData>cid:part2.xml</bgp:PartData>
               </bgp:DocumentPart>
            </bgp:Parts>
         </tem:multipartDocument>
      </tem:UploadMultipartDocument>
   </soapenv:Body>
</soapenv:Envelope>

Attachments in SoapUI:
part1.xml mit PART="part1.xml" und ContentID="part1.xml"
part2.xml mit PART="part2.xml" und ContentID="part2.xml"

Für den Request sind außerdem natürlich noch EnableMTOM und ForceMTOM auf true zu setzen.

Gruß
wax

21.06.2018 - 14:35 Uhr

Hier der ServiceContract:


    [ServiceContract(Namespace = "www.tempuri.org")]
    public interface IMultipartDocumentsService
    {
        [OperationContract(Name = "UploadMultipartDocument")]
        void UploadMultipartDocument(MultipartDocument multipartDocument);
    }

Die dazugehörigen Models:


[DataContract]
public class MultipartDocument
{

    [DataMember(IsRequired = true)]
    public string ID
    {
        get;
        set;
    }

    [DataMember(IsRequired = true)]
    public string CreationDate
    {
        get;
        set;
    }


    [DataMember(IsRequired = true)]
    public string Name
    {
        get;
        set;
    }

    [DataMember(IsRequired = true)]
    public Collection<DocumentPart> Parts
    {
        get;
        set;
    }

    public MultipartDocument()
    {
        Parts = new Collection<DocumentPart>();
    }

}



[DataContract]
public class DocumentPart
{

    [DataMember(IsRequired = true)]
    public string Name
    {
        get;
        set;
    }

    [DataMember(IsRequired = true)]
    public byte[] PartData
    {
        get;
        set;
    }

}

Hier das dazugehörige Binding:


<basicHttpBinding>
    <binding name="httpsWithMtom" messageEncoding="Mtom" textEncoding="utf-8">
        <security mode="TransportWithMessageCredential">
            <message clientCredentialType="UserName"/>
        </security>
    </binding>
 </basicHttpBinding>

Gruß
wax

21.06.2018 - 14:01 Uhr

Hi zusammen,

danke erstmal für die bisherigen Antworten!

Es muss nicht unbedingt per Stream gemacht werden.

Ich habe jetzt eine Variante, in der mehrere Dateien gleichzeitig geschickt werden könnten.
Hier mal ein Beispiel Aufruf, wie ich ihn aus SoapUI heraus abschicken möchte:


<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="www.tempuri.org" xmlns:bgp="http://schemas.datacontract.org/2004/07/WSController.Models">
   <soapenv:Header/>
   <soapenv:Body>
      <tem:UploadMultipartDocument>
         <!--Optional:-->
         <tem:multipartDocument>
            <bgp:Parts>
               <bgp:DocumentPart>
                  <bgp:Name>part1.xml</bgp:Name>
                  <bgp:PartData>cid:794981264365</bgp:PartData>
               </bgp:DocumentPart>
               <bgp:DocumentPart>
                  <bgp:Name>part2.xml</bgp:Name>
                  <bgp:PartData>cid:123481264365</bgp:PartData>
               </bgp:DocumentPart>
            </bgp:Parts>
         </tem:multipartDocument>
      </tem:UploadMultipartDocument>
   </soapenv:Body>
</soapenv:Envelope>

In SoapUI wird mir angezeigt, dass die beiden Attachments vom Typ "XOP" sind, also glaube ich erstmal in Ordnung.

Auf Service Seite wirft der XmlMtomReader jetzt die Exception "Ein MIME-Abschnitt mit der Content-ID "cid:794981264365" konnte nicht gefunden werden."

Also entweder schnürt SoapUI das Gesamtpaket nicht korrekt oder ich habe noch ein tieferliegendes Problem.

Gruß
wax

21.06.2018 - 08:05 Uhr

Hallo,

Ich habe einen WCF Service der es ermöglicht Dateien hochzuladen. Nun habe ich die Anforderung bekommen, dass die Dateien am besten mittels MTOM Encoding hochgeladen werden sollen und am besten 3 Dateien in einem Request. Der Endpunkt der sich um den Upload kümmert, hat als Binding Parameter das MessageEncoding mit MTOM eingerichtet. Jetzt frage ich mich ob ich im dazugehörigem ServiceContract einfach eine Collection von Streams verwenden kann oder ob es eine Collection von Byte Arrays sein muss, um mehrere MTOM Attachments gleichzeitig entgegennehmen zu können.

Kennt sich da jemand vielleicht mit aus?

Gruß
wax

16.04.2018 - 11:25 Uhr

Vielen Dank an alle Beteiligten.

Es waren tatsächlich .pdb Dateien mit im Deployment.

Gruß
wax

22.02.2018 - 09:17 Uhr

Hi Coffeebean,

also auf andere Projekte innerhalb meiner Solution verlinke ich über "Add Reference -> Projects". Ich referenziere aber auch .DLLs per "Add Reference -> Browse".

Sind diese "Browse" Verweise irgendwie anders hinterlegt im Projekt?

Also im Code habe ich keine Pfade hinterlegt.

Gruß
wax

22.02.2018 - 08:25 Uhr

Hallo zusammen,

Ich habe da ein kleines Problem mit absoluten Pfaden aus der Entwicklungszeit, die aus einem mir unbekannten Grund in meinen Assemblies verbacken sind.

Wäre eigentlich nicht so wild, nur leider stecken in den Log Files beim Kunden jetzt in den Exception Beschreibungen meine "C:\Dev..." Pfade. Das fühlt sich falsch an. 😉

Was könnte ich beim Build falsch machen?

05.10.2017 - 13:40 Uhr

Ich hatte die ganze Zeit einen falschen Typen verwendet. Jetzt bekomme ich mit meinem Code das gewünschte Verhalten, sprich es werden die Exceptions geworfen, falls ein Typ unbekannt ist.

Danke LaTino.

05.10.2017 - 13:13 Uhr

der wegen des fehlenden KnownType-Attributes in einer SerializationException resultiert. Wenn du das hast, kannst du deine TestCases anpassen und dann deine DataContracts vervollständigen

Genau das möchte ich erreichen und ich hatte gehofft das ein serialisieren mit dem DataContractSerializer die Exception werfen würde im Fehlerfall.

Ich stehe gerade auf dem Schlauch wie ich diese Exceptions herauskitzeln könnte.

ps: Der UnitTest dazu sieht so aus:


static Object[] DataContractTypes =
        {
            new Object[] {new ItemContainerDTO()},
            new Object[] {new ItemContainerDTO()},
            new Object[] {new DownloadDocumentDTO()},
            new Object[] {new UploadDocumentDTO()},
            new Object[] {new DocumentItemContainerDTO()},
            new Object[] {new DocumentResponseContainerDTO()},
            new Object[] {new ResponseContainerDTO()},
            new Object[] {new UploadDocumentResponseContainerDTO()}
        };


        [TestCaseSource("DataContractTypes")]
        public void ReflectionTest<T>(T source) where T : class
        {
            // Arrange
            ReflectionEqualityComparer<T> comparer = new ReflectionEqualityComparer<T>();

            // Act
            T deserializedObject = DataContractTestHelper.DataContractSerializationRoundTrip<T>(source);

            // Assert
            Assert.IsTrue(comparer.Equals(source, deserializedObject));
        }

05.10.2017 - 12:40 Uhr

Hallo zusammen,

ich würde gerne per Unit Test die Serialisierung/Deserialisierung meiner WCF Contract Klassen testen.

Um die De-/Serialisierung zu testen, kommt folgende Hilfefunktion zum Einsatz:


public static T DataContractSerializationRoundTrip<T>(T obj, IEnumerable<Type> knownTypes = null)
        {
            T result = default(T);

            var serializer = new DataContractSerializer(obj.GetType());

            using (MemoryStream memoryStream = new MemoryStream())
            {
                serializer.WriteObject(memoryStream, obj);
                memoryStream.Position = 0;
                result = (T)serializer.ReadObject(memoryStream);
            }

            return result;
        }

Das funktioniert für alle meine Typen ohne Probleme.

Zur Laufzeit wirft mein WCF Service am Client allerdings die Fehlermeldung, dass ein nicht erwarteter Typ gefunden wurde und ich diesen doch bitte zur Liste der "KnownTypes" hinzufügen soll. Wenn ich das mache klappt es natürlich wieder, allerdings würde ich gerne etwas Prophylaxe betreiben und diese Fehler bereits per Unit Tests finden.

Wie kann ich also die tatsächliche Serialisierung "simulieren" für den Unit Test?

15.02.2017 - 07:46 Uhr

Moin,

das klappt anscheinend nur unter Node.js. Im Browser sieht die WebSocket Klasse leider anders aus und nimmt dieses Options Objekt nicht entgegen.

MfG
wax

13.02.2017 - 16:03 Uhr

Guten Tag,

ich schreibe zur Zeit an einem WebSocket und würde diesen aus Gründen der Einfachheit gerne durch meinen bereits existierenden WebApi Service hosten lassen.

Webserver ist der IIS ab Version 8.
Der "Handshake" funktioniert soweit auch gut mittels:


[HttpGet]
public HttpResponseMessage Connect()
{
   if (HttpContext.Current.IsWebSocketRequest)
   {
       HttpContext.Current.AcceptWebSocketRequest(ProcessRequestInternal);
   }

   return new HttpResponseMessage(HttpStatusCode.SwitchingProtocols);
}

Ich bin diesen Weg gegangen, da mein Service sich bereits um die Authentifizierung meiner User kümmert. Dies wurde bisher per Basic-Http Authentication gemacht. Nun habe ich das Problem, dass ich den "Authorization: Basic blabla" Header nicht mehr mitsenden kann und somit sich der WebSocketController nicht mehr in meine Umgebung "passt".

Weiß jemand wie man das normalerweise macht? Per JavaScript WebSocket Objekt kann man z.B. keine Http-Header setzen. 😭

MfG
wax

12.02.2017 - 13:38 Uhr

Genau so ist es dann auch geschehen. Danke für die Hinweise. Mich hätte halt interessiert wie das andere Vorgehen funktioniert. 😉

Mit freundlichen Grüßen
wax

06.02.2017 - 21:36 Uhr

Es ist nur so das ich nicht steuern kann wann welcher Test ausgeführt wird und die einzelnen SUTs verwenden Zugriffe auf window["MyGlobal"]. Ich möchte gerne erreichen das jeder Test seine eigene globale Umgebung erhält. Leider kriege ich das unter TypeMoq nicht hin. Deswegen die Frage

06.02.2017 - 20:16 Uhr

Hallo zusammen,

hat vielleicht jemand Erfahrung mit globalen Mocks unter TypeMoq?
Ich möchte den Zugriff auf


window["MyGlobal"]

gerne mittels TypeMoq mocken.

Dazu verwende ich ein Interface von MyGlobal.


let globalMock = TypeMoq.GlobalMock.ofType2<IMyGlobal>('MyGlobal', window);

Das funktioniert soweit auch ganz gut, allerdings bekomme ich mit mocha race conditions, da sich mehrere Tests wohl parallel das globale Objekt "kaputt" schreiben.

Nun habe ich auf der Doku-Seite von TypeMoq etwas von GlobalMock + GlobalScope gesehen und getestet, bekomme dieses "Sandbox" verhalten allerdings nicht hin. Wenn ich z.B. am Ende des Tests verifiziere, wie oft eine bestimmte Methode des Mocks aufgerufen wurde, dann sehe ich, dass alle Aufrufe addiert wurden und nicht in eigenen Scopes stattfanden.

Falls hier jemand Erfahrung hat, wie man am besten damit umgeht, wenn Tests sich mit globalen Objekten in die Haare kriegen, dann möge er dies bitte mitteilen. 😉

Gruß
wax

02.11.2016 - 11:16 Uhr

Hi,

ja die BasisDLL ist meine WebAPI. In dieser sind "Haupt" Controller der Anwendung implementiert und eben auch ein PlugInBaseController.

Von diesem PlugInBaseController leiten PlugIn-Controller ab.

Anscheinend war das nicht die beste Idee....

Gruß
wax

14.10.2016 - 09:11 Uhr

Die Plugin Controller erben von einem Basis-Controller und dieser ist in einer "Basis-Dll" definiert.
Wenn nun diese Basis-Dll-Version aus z.B. firmenpolitischen Gründen erhöht wird, was geschieht dann mit abhängigen Assemblies?

Mir fallen zwei Lösungen spontan ein:

  1. Die Plugin-Hersteller zwingen neu zu kompilieren.
  2. Den Plugins sagen, dass sie nicht eine spezifische Basis-Dll referenzieren sollen.

Wie macht man so etwas im .NET Bereich?

Gruß
wax

edit: Das Plugin System wurde selbst entwickelt.

14.10.2016 - 08:37 Uhr

Guten Morgen,

ich habe eine ASP.NET Web Api Lösung die z.B. mit der Assembly Version 1.0 markiert wurde. Für diese Basis Dll wurden nun Plugin Controller entwickelt. Die Plugins verweisen auf die Basis Dll. Wenn ich nun eine neue Version 2.0 der Web Api veröffentliche, wie kann ich dann sicher stellen, dass die alten Plugins weiterhin funktionieren?

Eine Neukompilierung aller Plugins kommt nicht in Frage.

Gruß
wax

19.07.2016 - 11:59 Uhr

Hallo zusammen,

ich schraube zur Zeit an einem WiX Setup und installiere mit Hilfe des Setups Visual Studio Projektvorlagen.

Dazu verwende ich diese Custom Action aus der WixVSExtension Biblio:


<CustomActionRef Id="VS2015InstallVSTemplates" />

Leider ist dieser Aufruf seeeeehr laaaangsam. Ich spreche von ca. 5 Minuten. Egal auf welchem System installiert wird.
Das Setup macht zwar was es soll und die Templates werden anschließend auch im Studio angezeigt, doch das Setup ist so nicht ertragbar. Selbiges passiert dann auch beim deinstallieren.

Die Projektvorlagen sind geradezu winzig. Nur ein paar KB groß.

Weiß vielleicht einer woran das liegen kann?

Gruß
wax

02.06.2016 - 08:51 Uhr

Ich glaub Dich verwirrt das nur, weil Du der Sprache noch nicht ganz mächtig bist 😉

Das mag durchaus sein. 😉

Ich hätte halt gerne das geschrieben


var engineMock: TypeMoq.Mock<Model.IEngine> = typemoq.Mock.ofType(Model.IEngine);

und nicht das


var engineMock: TypeMoq.Mock<Model.IEngine> = typemoq.Mock.ofType(Model.TurboEngine);

Einfach weil ich keinen Bezug zu ner konkreten Implementierung haben möchte.

Gruß
wax

01.06.2016 - 23:30 Uhr

Guten Abend,

hat vielleicht jemand hier Erfahrung mit einem Mocking Framework für JavaScript/Typescript und kann dieses empfehlen?

Ich habe mir TypeMoq und JsMockito + TypeScript Definition angeschaut und beide Frameworks haben mich nur verwirrt.

Ich bin es gewohnt, dass ich ein Mock-Objekt z.B. so definiere:


var mock = new Mock<Interface>();
mock.Setup(obj => obj.Name).Returns("Hans");

In den JavaScript/Typescript Frameworks muss man dem "Mock<>" Konstruktor eine Instanz oder eine Funktion übergeben, von der dann das Mock-Objekt erstellt wird.
Wenn ich aber bereits eine Instanz einer konkreten Klasse hätte, dann bräuchte ich kein Mock mehr.

Ihr seht, die Tools verwirren mich mehr als das sie mir zur Zeit helfen.

Vielleicht habt ihr ja bereits Erfahrungen in dem Bereich sammeln können und könnt mir ein Tool empfehlen.

Gruß
wax

11.05.2016 - 11:23 Uhr

Hallo zusammen,

ich versuche mich zur Zeit in Sachen Entwicklungstrends im SPA Bereich auf den neusten Stand zu bringen, da ich in naher Zukunft ein Projekt in diesem Bereich beginnen werde.

Nun ist es leider so, dass mich die Fülle an Suchergebnissen erschlägt, wenn ich mich über JavaScript (Patterns) Best Practices, Design, Code Stile, Module usw. informieren möchte.

Für OOP in JavaScript benötigt man zusätzliche Bibliotheken. Um JavaScript Code modularisierbar zu machen, verwendet man anscheinend Bibliotheken wie JSModule oder Node.js oder....

Wir würden gerne während der Entwicklung der Anwendung weiterhin im Visual Studio arbeiten inkl. Typsicherheit durch den Compiler. Deswegen wird überlegt ob TypeScript nicht die richtige Technologie für uns sein könnte.

So wie ich das sehe würden wir mittels TypeScript alle von mir genannten Anforderungen erfüllt bekommen, oder?

  • TypeScript lässt uns weiterhin OO programmieren
  • TypeScript bietet von haus aus modularisierbaren Code, da Namespace Support usw.
  • Typsicherheit durch den Compiler
  • Intellisense

Ist das soweit korrekt oder mache ich mir falsche Hoffnungen? 😉

Gruß,
wax

03.05.2016 - 15:51 Uhr

Es scheint das dies hier eine einfache Variante darstellt um an die Daten zu kommen:


UserNameSecurityToken securityToken = OperationContext.Current.IncomingMessageProperties.Security.IncomingSupportingTokens[0].SecurityToken as System.IdentityModel.Tokens.UserNameSecurityToken;

string username = securityToken.UserName;
string password = securityToken.Password;

Gruß,
wax

03.05.2016 - 11:31 Uhr

Hallo,

ist es möglich an den Benutzernamen und das Passwort, welches per SOAP-Header übertragen wird, im ICallContextInitializer dran zu kommen?

Ich verwende zur Authentifizierung eine eigene Implementierung von UserNamePasswordValidator und leider brauche ich im CallContext das Passwort nochmal, doch dort gibt es nur noch den Benutzernamen.

Weiß jemand wie man das machen könnte?

Gruß,
wax

16.03.2016 - 17:59 Uhr

Ja bin ich. Ich glaube ich weiß wo der Knackpunkt ist....

Um mir von den PlugIns zusätzliche Informationen zu holen habe ich bisher mittels Activator eine Instanz erstellt. Das hat so lange funktioniert wie das Plugin einen parameterlosen Konstruktor hatte. Jetzt wird alles plötzlich ganz klar. Ich könnte mir eine Instanz vom parameterlosen Konstruktor erstellen lassen und dann mittels UnityContainer.BuildUp die benötigten Abhängigkeiten injizieren. Mittels PropertyInjection.

Gruß,
Wax

===

Bzw. ich kann auch Unity direkt "resolven" lassen und ganz auf Activator.CreateInstance verzichten.

16.03.2016 - 17:23 Uhr

Im Großen und Ganzen rufe ich diese Config-Methode, welche ich am Anfang, nachdem der UnityContainer erstellt und initialisiert wurde, in der Global.asax auf:


public static class UnityConfig
{

    /// <summary>
    /// Registers the components.
    /// </summary>
    public static void RegisterComponents()
    {            
        // register all your components with the container here
        // it is NOT necessary to register your controllers
        GlobalConfiguration.Configuration.DependencyResolver = new UnityResolver(Global.Container);
    }
}

Später im Code lade ich die Assemblies, in denen PlugIn-ApiController existieren.
Ich kann im debugger sehen, wie meine "UnityResolver" Klasse für jede Anfrage verwendet wird.
Nur halt nicht für meine PlugIn-Controller. Hier ist mal ein Beispiel PlugIn-Controller:


public class PlugInController : PlugInBaseController
{
    IMyInterface _instance;

    public PlugInController(IMyInterface instance)
    {            
       
        _instance = instance;
    }
}

"PlugInBaseController" erbt von "BaseController" und dieser wiederum von "ApiController".

Gruß,
wax

16.03.2016 - 16:31 Uhr

Genau so wie in diesem Beispiel habe ich es gemacht. Ich bin also den Weg über einen eigenen IDependencyResolver gegangen.

Um meine PlugIns zu laden habe ich einen eigenen AssemblyResolver erstellt. Das funktioniert wie gesagt auch solange wie ich in den PlugIns parameterlose Konstruktoren verwende.

Sobald ich in meinen PlugIn-WebApi-Controllern einen Parameter im Konstruktor nutze, wird dieser Controller garnicht mehr geladen. Also wird seine Route auch nicht mehr bedient.

Gruß,
wax

16.03.2016 - 14:44 Uhr

Hallo zusammen,

ich verwende den Unity Container für meine Web Api Anwendung. Damit Abhängigkeiten der verwendeten ApiController auch aufgelöst werden können, verwende ich die Zusatzkomponenten "Unity.WebApi".

Das funktioniert auch super.

Nun möchte ich aber auch in meinen PlugIn-Controllern diese Funktionalität nutzen.
Also zum Beispiel im Konstruktor eines PlugIn-Controllers eine Abhängigkeit injizieren.
Leider wird dieser Controller nun nicht mehr korrekt geladen, da die WebApi wohl keinen parameterlosen Konstruktor mehr findet. Ist ja auch richtig so.
Ich weiß leider nicht wie ich meine geladenen PlugIn-Controller nun auch Unity in einer Art bekannt mache, wie es "Unity.WebApi" anscheinend mit meinen anderen WebApi-Controllern automatisch gemacht hat.

Weiß jemand was zu tun ist?

Gruß,
wax

04.03.2016 - 09:23 Uhr

Das hatte ich auch gelesen. Ich interpretiere das als "fire and forget", also er kennt die Objekte nach der Instanziierung nicht mehr.

Gruß,
wax

04.03.2016 - 08:44 Uhr

Hallo zusammen,

Ich arbeite zur Zeit zum ersten Mal mit Unity als DI-Container und habe eine Frage bzgl. der Lebensspanne von Objekten, die durch den Container erzeugt wurden. Der erzeugte Typ wurde mit einem Standard TransientLifetimeManager registriert. Ist es nun so, dass der Unity Container selbst eine Referenz auf das erzeugte Objekt hält oder wird es ganz normal vom GC abgeräumt, sobald es nicht mehr "benötigt" wird?

Gruß,
wax

12.02.2016 - 13:58 Uhr

@Abt: Könntest du bitte einmal deine Aussage "Ich halte nichts von Impl-Projekten - wir sind ja nicht bei Java. 😃" begründen. Würde mich interessieren.

Gruß,
wax

11.02.2016 - 14:54 Uhr

Hi Abt,

ich habe mich nun mit Unity auseinandergesetzt.
Mein Ansatz ist zur Zeit der, dass ich den IUnityContainer zur Registrierung der Typen durch die Projekte reiche. Dazu benötigen ich von meiner Composition Root aus aber immer Referenzen auf die Implementierungs-Prjojekte, da nur diese Interface UND Implementierung kennen.

Da muss doch was falsch sein. Ich dachte man würde nur an den Interfaces hängen!? So ist mein "Main"-Projekt ja weiterhin von den Impl-Projekten abhängig.

Wie macht man sowas?

Gruß,
wax

09.02.2016 - 11:51 Uhr

Hallo zusammen,

ich versuche mich zur Zeit in das Thema Dependency Injection einzuarbeiten und nutze dazu Ninject.

Ich habe mehrere Anwendungen, die mit demselben Datenmodell arbeiten für sich gesehen aber spezielle Anforderungen haben.

Nun wollte ich die Validierung des Models (mittels FluentValidation auslagern und in eine eigene Assembly packen. Der geeignete Validator für ein Modell soll per DI bereitgestellt werden. Deswegen dachte ich mir, dass man die Registrierung dieser Typen innerhalb der Validation-Assembly vornehmen sollte.

Das Model wird unter anderem von einer ASP.NET WebApi 2 Anwendung verwendet. Diese hat auch Typen, welche per DI bereitgestellt werden sollen. Also bekommt die Anwendung auch eine "DI-Konfiguration".

Dies ist die Stelle, an der ich nicht mehr weiter weiß. Ist dieser Ansatz überhaupt gut gewählt und wenn ja, wie baut man das mit z.B. Ninject nun auf?
Teilen sich alle Komponenten ein und dieselbe Ninject-Kernel-Instanz oder gibt es mehrere?
Muss man dediziert einen Kernel erzeugen und diesen dann durch die Komponenten zur Registrierung ihrer Typen durchreichen?

Ich hoffe ihr könnt etwas Licht ins Dunkel bringen und mir weiterhelfen.

Gruß,
wax

edit: Titel auf Unity geändert

09.02.2016 - 11:38 Uhr

Leider ist der Code zu tief verschachtelt, um alles hier zu zeigen.
Ich habe es gelöst, in dem ich die relevanten Teile aus mehreren Ebenen zusammengefasst habe und direkt in der "OnActionExecuting" - Methode ausführe:


public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
        {
            if (!actionContext.ModelState.IsValid)
            {
                String errorMessage = CreateErrorMessageFromModelState(actionContext.ModelState);
                
                IMyResponse resultContent = new MyResponse();
                resultContent.Error = new MyError(errorMessage );
                
                HttpResponseMessage response = actionContext.Request.CreateResponse<IMyResponse>(HttpStatusCode.BadRequest, resultContent, new CustomJsonMediaTypeFormatter());
                actionContext.Response = response;
            }
        }

Der Code um das HttpResponseMessage-Objekt zu bekommen, war zuvor in min. 3-4 Methodenaufrufen verschachtelt. Da wurde aber nirgends ein Task erstellt und async war auch nicht zur Stelle.

Weiß ehrlich gesagt nicht woran es gelegen hat.

Gruß,
wax

08.02.2016 - 15:43 Uhr

Hallo,

ich habe zur Zeit das Problem, dass ich folgende Fehlermeldung bekomme:> Fehlermeldung:

"Der Thread befindet sich bereits im Hintergrundverarbeitungsmodus".

Dies passiert, wenn ich in einem ASP.NET WebApi ActionFilterAttribute mein Modell validiere und im Fehlerfall der Eigenschaft HttpActionContext.Response einen Fehler-Response zuweise.

Ich muss allerdings dazu sagen, dass der Inhalt des Response-Objektes ein JSON-String ist, welcher mittels Json.NET serialisiert wird.

Hat jemand schon mal ein ähnliches Problem gehabt bzw. kann mir sagen was ich machen kann?

Gruß,
wax

05.02.2016 - 09:07 Uhr

Nur noch ein kurzer Nachtrag.

Natürlich muss man sich nicht durch die GUI klicken, sondern kann das auch per Kommandozeile lösen:

Zum Beispiel so:


dism /online /enable-feature /all /featurename:IIS-ASPNET45

Gruß,
wax

02.02.2016 - 13:30 Uhr

Sorry für den Titel!

Also ein einfaches aspnet_regiis.exe -i hat nicht geholfen, aber nachdem ich in Windows 7 unter Features-->Internetinformationsdienste-->Anwendungsentwicklung die ASP.NET und ISAPI Häkchen deaktiviert, den Rechner neu gestartet und anschließend wieder aktiviert habe, läuft es plötzlich wieder.

02.02.2016 - 12:49 Uhr

Hallo,

ich habe aktuell das Phänomen, dass ich bei mir auf meiner Maschine .NET 4.5.1 deinstalliert und .NET 4.5.2 installiert habe und nun funktionieren meine ASP.NET Web Api - Anwendungen nicht mehr.

Es gibt nur noch 404 Responses.

Weiß jemand was da geschehen sein könnte?

Gruß,
wax