Announcement

Collapse
No announcement yet.

WebService stand alone

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • WebService stand alone

    Hi @ all.

    Kann man einen Webservice als stand alone Application laufen lassen ohne den IIs?

    Was muss ich dafür machen?

    Beispielcode für Microsofts AdventureWorks Cinema wäre nicht schlecht.

    danke

  • #2
    Hallo,

    die Antwort entspricht dem Muster von "<i>Radio Eriwan</i>": Im Prinzip ja - aber welchen Nutzen soll das haben?

    &gt;Was muss ich dafür machen?

    Wenn der unter Windows 2003 Server betriebene Microsoft SQL Server 2005 die Daten verwaltet, kann der SQL Server ohne den Umweg über den IIS direkt einen Web Service anbieten. Ab Windows Server 2003 ist der für HTTP-Anfragen zuständige Kernelmodetreiber (<i>http.sys</i>) direkt in das Betriebssystem integriert. Daher können mehrere Anwendungen gleichzeitig den identischen Port (80) für HTTP-Verbindungen nutzen

    Comment


    • #3
      Hi Andreas.

      Nein ich meinte das anders. Da hast Du mich falsch verstanden.
      Ich möchte einen WebService als Applikation laufen lassen.

      Dazu brauche ich ja einen WebServer.
      Ich habe keine Beispiel dafür gefunden wie ich in einen eigenen WebServer einen WebService laufen lassen kann.

      In Delphi habe ich es schon gemacht! Ich habe einen WebServer einen WebService und einen Client in einer einzigen Applikation gepackt. Zu Testzwecken. Der Client dient aber nur zum testen.
      Wenn das Programm gestartet wird ist der WebService sofort auch über Browser erreichbar. Mir geht es in erster Linie nur darum zu verstehen wie man das in C# realisieren kann und wie ich den WebService im Netzwerk public machen kann.

      Ich möchte nicht denn IIs oder Apache WebServer benutzen müssen.

      Von Microsoft gibt es wohl das Cassini Projekt und eine WebService erweiterung WSE oder so. Das muss ich aber auch nicht unbedingt haben.

      Ich möchte einen winzigen WebServer der die funktionalität des WebServices bereitstellt. Also ein Sender und Responder!
      Ansprechbar über einen bestimmten Port.
      Läuft die Applikation soll der WebService auch erreichbar sein.
      Daraus könnte ich dann auch einen Dienst bauen oder ähnliches.
      Die Datenbank interessiert mich im moment überhaupt nicht!

      In C# mache ich gerade meine ersten Schritte und habe auch nicht viel Erfahrung mit der Net Umgebung. Das ändert sich aber von Tag zu Tag.

      Ich bin ebend dumm! Mach mich doch schlau :-).

      danke für Deine Hilfe
      Torste

      Comment


      • #4
        Hallo,

        wenn die eigene Anwendung um die Funktion eines Webservers erweitert werden soll, ist die Klasse <b>HttpListener</b> aus dem Namespace <i>System.Net</i> zuständig. Dabei muss die URL definiert werden, für die dieser Webserver zuständig sein soll:

        <div style="font-family: Consolas; font-size: 10pt; color: black; background: white;"><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: teal;">HttpListener</span> listener = <span style="color: blue;">new</span> <span style="color: teal;">HttpListener</span>();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; listener.Prefixes.Add(<span style="color: maroon;">"http://localhost:8081/AppURL/"</span>);</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; listener.Prefixes.Add(<span style="color: maroon;">"http://127.0.0.1:8081/AppURL/"</span>);</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; listener.Start();</p></div>

        Sobald die <b>HttpListener</b>-Instanz den Port und die URL überwacht, muss die eigene Webserver-Implementierung auf einen Aufruf warten, in dem <b>GetContext</b> aufgerufen wird. Sobald ein Aufruf erkannt wurde, kann die Klasse <b>SimpleWorkerRequest</b> verwendet werden, um den HTTP GET-Aufruf zu verarbeiten. Das Prinzip könnte so aussehen:

        <div style="font-family: Consolas; font-size: 10pt; color: black; background: white;"><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">while</span> (<span style="color: blue;">true</span>)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: teal;">HttpListenerContext</span> ctx = listener.GetContext();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">string</span> page = ctx.Request.Url.LocalPath.Replace(<span style="color: maroon;">"/"</span>, <span style="color: maroon;">""</span>);</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">string</span> query = ctx.Request.Url.Query.Replace(<span style="color: maroon;">"?"</span>, <span style="color: maroon;">""</span>);</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: teal;">Console</span>.WriteLine(<span style="color: maroon;">"Received request for {0}?{1}"</span>, page, query);</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: green;">//</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: green;">// Webserveraufruf in einem anderen Thread verarbeiten</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: green;">// ...</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: green;">// </span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; sw.Flush();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ctx.Response.Close;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p></div>

        Eine ausführliche Beschreibung hat Microsoft im Artikel <i>Run ASMX Without IIS</i> veröffentlicht (<i>http://msdn.microsoft.com/msdnmag/issues/04/12/ServiceStation/default.aspx</i>). Eine weitere Beschreibung ist unter dem Titel <i>Der eigene kompakte und sichere Web Server mit .NET 2.0 - Teil 1</i> über die URL <i>http://www.microsoft.com/germany/msdn/library/security/DerEigeneKompakteUndSichereWebServerMitNET20Teil1. mspx?mfr=true</i> abrufbar.

        &gt;Daraus könnte ich dann auch einen Dienst bauen oder ähnliches...

        Die Frage ist eben nur, welchen Sinn es macht, eine bereits vorhandene Infrastruktur selbst nachbauen zu wollen

        Comment


        • #5
          Hi Andreas,

          super danke. Das habe ich im Netz nicht gefunden.
          Habe zwar gegoogelt aber Google hat auch nachgelassen.

          >>
          >Daraus könnte ich dann auch einen Dienst bauen oder ähnliches...
          Die Frage ist eben nur, welchen Sinn es macht, eine bereits vorhandene Infrastruktur selbst nachbauen zu wollen.
          <<

          Der Sinn liegt darin nicht vom IIs abhängig zu sein.
          Es gibt dann eigene Regeln. Ausserdem fand ich den IIs immer schon grottenschlecht. Das ist meine Meinung! Bis ASP hasser.
          Arbeite viel lieber mit PHP. Das ist viel flexibler.
          Der Apache WebServer ist da auch wesentlich besser.

          Ausserdem muss der IIs immer nachinstalliert werden.
          Mir reicht schon die Tatsache das Leute von XP das Net Framerwork installieren müssen um eine C# Anwendung laufen lassen zu können. In dieser Sache hat Microsoft Nachteile gegenüber Delphi. Der Vorteil ist aber die kompaktere Applikation.
          Die Exe-Datei ist viel kleiner mit Forms als die von Delphi.

          Übrigens gilt das mit den Frameworks auch für Vista wenn für das Net Framework 3 entwicklet wird. Oder sehe ich das falsch?
          Was mich interresiert ist noch folgendes. Wird das Net Framwork 3 das Net Framework 2 bei einer Installation ersetzen und erweitern oder wird es parralel installiert?

          Letzteres macht wenig Sinn könnte ich mir aus Kompatibilitästsgründen aber vorstellen.

          danke
          Torsten Boettche

          Comment


          • #6
            Hallo,

            &gt;Ausserdem muss der IIs immer nachinstalliert werden..

            Das gilt aber auch für PHP und Apache ;-)

            &gt;Wird das Net Framwork 3 das Net Framework 2 bei einer Installation ersetzen und erweitern
            &gt; oder wird es parralel installiert?

            Mit .NET 3.0 werden nur Funktionen zum bisherigen .NET 2.0 hinzugefügt (d.h. das .NET Framework 2.0 ist eine Teilmenge von .NET 3.0). Wenn .NET 2.0 auf dem Rechner bereits installiert war, kommt .NET 3.0 zusätzlich hinzu. Somit gelten die gleichen Regeln wie beim Wechsel von .NET 1.x zu 2.0. Eine neue .NET Frameworkversion ersetzt nicht die alte Version, sondern stellt nur neue Möglichkeiten zur Verfügung.

            Eine .NET-Anwendung regelt im Manifest, welche Version des .NET Frameworks zuständig ist. Aus diesem Grund ist es normal, wenn auf dem Rechner mehrere .NET-Versionen parallel installiert sind

            Comment


            • #7
              Moin Andreas.

              Wenn ich Dich richtig sehe ist das so.

              //Teil 1 ************************************
              - Framwork 1 installiert
              - Framework 2 installiert das Framework 1 ergänzt
              //*****************************************

              //Teil 2 ************************************
              - Framwork 2 installiert = cumulativ zu Framework 1 =
              Die Installation des Frameworks 2 beinhaltet Framework 1 ohne die Basis Framework 1 installiert zu haben.
              - Framework 2 installiert und gergänzt Framework 1
              //*****************************************

              //Teil 3 ************************************
              - Framwork 3 installiert = cumulativ zu Framework 1 + 2 =
              Die Installation des Frameworks 3 beinhaltet Framework 1 und Framework 2 ohne die Basis Framework 1 oder 2 installiert zu haben.
              - Framework 3 installiert und gergänzt Framework 1
              mit Framework 2 und Framework 3 Funktionen.
              Die Installationen werden immer grösser! Oder?
              //*****************************************

              usw...

              dank

              Comment


              • #8
                Hallo,

                &gt;Die Installationen werden immer grösser! Oder?

                Wenn der Anwender über die Jahre mit .NET-Anwendungen der verschiedenen Versionen arbeitet, trifft dies zu. Denn nur über diesen Weg kann die so genannte "DLL-Hölle" endgültig verbannt werden. Jede .NET-Anwendung kann über das Manifest eine bestimmte Version einer DLL anfordern. Das Betriebssystem kann beliebig viele DLL-Versionen mit dem identischen Dateinamen verwalten.

                &gt;...Frameworks 2 beinhaltet Framework 1 ...

                Nicht ganz. Beim .NET Framework 2.0 werden nur wenige 1.x-Dateien nachinstalliert, wenn das .NET Framework 1.x zum Zeitpunkt des Setups nicht vorgefunden wird.

                Das .NET Framework 3.0 allerdings setzt auf den vollständigen Vorgänger auf, so dass nach der Installation von .NET 3.0 sowohl 2.0 als auch 3.0 vollständig auf dem Rechner ist.

                Wenn eine .NET 3.0.-Anwendung auf Assemblies zugreift, die mit Visual Studio 2003 (.NET 1.1) entwickelt wurden, werden zur Laufzeit in der Tat alle 3 Versionen des .NET Frameworks eingebunden.

                Comment


                • #9
                  Hallo,

                  ich habe, wie im von A. Kosch genannten Artikel "Run ASMX Without IIS", die HTTP.SYS in meiner Anwendung gehostet. Das funktioniert soweit auch ganz gut und die WebServices werden korrekt verarbeitet. Jetzt möchte mein Chef (bzw. unser Kunde), dass beim Aufruf eines WebServices eine Reaktion in meiner Anwendung stattfindet. Beispiel: Der Client ruft den WebService "UKWKanal" mit dem Parameter 94,8 auf. Also: UKWKanal(94.8). In der Oberfläche meiner Anwendung soll dann die Kanalanzeige auf 94,8 gesetzt werden. Wie bekomme ich die Verbindung vom WebService zu meiner Anwendung hin?

                  Helmu

                  Comment


                  • #10
                    Hallo,
                    der gehostete Web Service ist in der gleichen Anwendung (d.h. innerhalb des Prozesses der Benutzeroberfläche) und wird in einem anderen Thread ausgeführt. Ein praktikabler Weg könnte über die Botschaftswarteschlange des Programmfensters führen, indem der Web Service innerhalb seiner Methode über die Win32-API-Funktion <b>PostMessage</b> eine benutzerdefinierte Botschaft zum Hauptfenster schickt. Das Hauptfenster wird somit informiert, dass es an der vereinbarten Datenschnittstelle neu zu verarbeiten Informationen gibt:

                    <div style="font-family: Consolas; font-size: 10pt; color: black; background: white;"><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: green;">//</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: green;">// Der "Sender" (gehosteter Webservice)</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: green;">//</span></p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">const</span> <span style="color: blue;">int</span> WM_APP = 0x8000;&nbsp; <span style="color: green;">// aus WinUser.h</span></p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; [System.Runtime.InteropServices.<span style="color: teal;">DllImport</span>(<span style="color: maroon;">"user32.dll"</span>)]</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">extern</span> <span style="color: blue;">static</span> <span style="color: blue;">int</span> PostMessage(<span style="color: blue;">int</span> hWnd, <span style="color: blue;">int</span> Message, <span style="color: blue;">int</span> wParam, <span style="color: blue;">int</span> lParam);</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> <span style="color: blue;">void</span> SendMsg()</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: green;">// Benachrichtigung in der Botschaftswartschlange des Programmfensters</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: green;">// ablegen (asynchron)</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; PostMessage(FormMain.Handle.ToInt32(), WM_APP, 0, 0);</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: green;">//</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: green;">// Der "Empfänger" (Windows Forms-Benutzeroberfläche)</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: green;">//</span></p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">protected</span> <span style="color: blue;">override</span> <span style="color: blue;">void</span> WndProc(<span style="color: blue;">ref</span> System.Windows.Forms.Message msg)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">switch</span> (msg.Msg)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">case</span> WM_APP:</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; MessageBox.Show(<span style="color: maroon;">"WM_APP"</span>);</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">break</span>;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">default</span>:</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">break</span>;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">base</span>.WndProc(<span style="color: blue;">ref</span> msg);</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; }</p></div&gt

                    Comment


                    • #11
                      Hallo Herr Kosch,

                      vielen Dank für die Antwort. Ich habe aber wohl in meiner Beschreibung zu sehr abgekürzt. Der Webservice muss den Wert an eine Klasse in der Anwendung übergeben, die dann wiederum andere Klassen (zur Messgerätesteuerung) und auch die Oberfläche mittels Ereignissen über den neuen Wert informiert. Der Webservice bzw. ASP.Net wird ja in einer anderen AppDomain ausgeführt. Muss ich dann über .Net Remoting gehen?

                      Helmu

                      Comment


                      • #12
                        Hallo Herr Windecker,

                        auch wenn der Post schon über 4 Monate her ist, möchte ich kurz darauf antworten.

                        Die Lösung sollte eine Proxyklasse sein.
                        Diese kann einfach mit dem WSDL tool (wsdl.exe) erstellt werden.
                        Sie wird dann im client benutzt, um den entfernten Aufruf des Webservices durchzuführen.

                        Wahrscheinlich ist die Lösung schon bekannt, aber es schadet ncihts, wenn Sie hier im Thread steht

                        Da ich im Moment auch daran arbeite, einen Webservice ohne den IIS zu hosten, würde mich interessieren, inwieweit ihr Projekt vorangeschritten ist.
                        Meine Absicht ist es ebenfalls, einen eigenen kleinen Webserver mit Hilfe der HttpListener Klasse zu realisieren, der den Webservice hostet.
                        Vielleicht haben sie noch Stolperfallen im Kopf, die ich beachten muß.

                        Viele Grüße,
                        Enrico bertram

                        Comment


                        • #13
                          Sorry,
                          ich war schon eine Weile nicht mehr hier.


                          Hier eine kleine Linksammlung zum Thema:

                          Webcast von Christian Weyer (Mai 2005):
                          http://www.codezone.de/Redir.aspx?UR...id%3d118758880
                          basiert auf:
                          http://msdn.microsoft.com/msdnmag/is...n/default.aspx

                          Access Control List:
                          http://pluralsight.com/blogs/keith/a.../17/15632.aspx

                          WSE 3.0:
                          http://pluralsight.com/blogs/aaron/a.../14/15571.aspx
                          http://pluralsight.com/blogs/keith/a.../17/15633.aspx

                          http://www.microsoft.com/germany/msd...ET20Teil1.mspx

                          Insgesamt sollte man aber falls möglich die WCF nehmen.

                          Helmut

                          Comment


                          • #14
                            Vielen Dank für die Links, die Konfiguration habe ich per httpcfg.exe gemacht.

                            Ein paar graue Haare hat die Fehlersuche gebracht im Bereich der von HttpWorkerRequest abgeleiteten Klasse.
                            Stichwort: Servervariablen. - Da sollte man nicht vergessen, die für das eigene Anwendungsszenario wichtigen zu implementieren und sich dann wundern, warum HttpRuntime ein paar Sachen verschluckt...

                            Ansonsten ist (jetzt, wo der Server zu 95% fertig ist) alles eigentlich ganz einfach und halbwegs "straight forward" zu implementieren.

                            gruß
                            Enrico Bertram

                            Comment

                            Working...
                            X