Autor Beitrag
CurdledMilk
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: Mi 30.09.09 08:23 
Hallo ich hoffe mal ich bin Hier im richtigen Bereich des Forums und Ihr könnt mir bei meinem Problem Helfen =)

Es geht um Folgendes:

Ich bekomme von einem (externen) Programm eine XML basierte Nachricht an einen Webservice geschickt und will diese sobald sie ankommt automatisch verarbeiten lassen. Desweiteren möchte ich über den eingang dieser Nachricht informiert werden um dem Nutzer dies sichtbar zu machen. Den Webservice und die App beim Endnutzer wird von mir geschrieben.


Ich nutze:

Microsoft Visual Web Developer Express 2008 (für den Webservice)
Microsoft Visual C# Express 2005 (für die Anwendung)


Meine Überlegung:

Der Webservice erhält die XML Nachricht, wandelt diese um (liest die values aus dem XML aus und speichert sie in Variablen) und löst ein Event in meiner EndAnwendung aus. Darauf hin greift meine Client Anwendung auf den Webservice zu (z.B. über eine get Methode) und holt sich so die Daten.


Meine Probleme:

Ist dies überhaupt der richtige Ansatz? Gibt es evt. eine viel einfachere und bessere Möglichkeit das Problem zu lösen?

Wenn ja --> was sind eure Ideen

Wenn nein -->
Wie kann ich vom Webservice mein Programm informieren das neue Daten angekommen sind? (evt. über Events?)
Wenn ich auf Klassenvariablen im Webservice zugreife und diese setze sind diese nach dem Zugriff wieder "weg" ... Ich kann sie static machen dann geht es. Nur weiß ich nicht ob das die "optimale" Lösung ist.


Das sind erst einmal meine Überlegungen und ich hoffe Ihr könnt mir da einen Anstoß in die richtige Richtung geben.


PS: mir geht es hier weniger um Code (außer wenn er für das Verständnis notwendig wäre) sondern mehr um Ideen und Lösungsansätze, evt. Stichworte worüber man sich informieren sollte etc.
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Mi 30.09.09 12:37 
Hallo,

ist der Transport der Informationen per WebService zwingend? Wo wird der Server/Client laufen?

Dein Vorschlag sollte prinzipiell umsetzbar sein und eigenltlich auch logisch :)

Alternativ könntest du die Kommunikat per Tcp oder Udp direkt machen (vorzugsweise per TCP damit die Packete/Verbindung überwacht wird). Dann verbindet sich der Client zum Server, regestriert sich für gewünschte Daten und wartet dann auf diese. Wäre auch (wie WebServices) sprachenunabhänig und auf einem niedrigerem Niveau (können meist auch Skripte damit umgehen).

Gruß Daniel
CurdledMilk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: Mi 30.09.09 13:51 
Hallo ... vielen Dank für die Antwort ... noch einmal genauer zur architektur

1 PC mit einem Server (Integrationssoftware) an diesem hängen mehrere DB (Auf diese wird vom Web zugegriffen)
auf diesem Rechner läuft auch der Webservice

1 PC mit der BackOffice Anwendung

Situation:

Wenn auf einer der DB informationen eingehen werden diese durch die Integrationssoftware repliziert und auch an die Bockofficeanwendung weitergegeben. Es ist wichtig das die Daten schnell verarbeitet werden, da sie erst nach einer Kontrolle (wird durch einen Mitarbeiter gemacht) weiterverarbeitet werden können.

Die Integrationssoftware hat Schnitstellen zu verschiedenen DBMS, Dateisystemen, OfficeAnwendung, R/3 - Systemen etc. und ebend zu WebSerivces.

mein aktueller ansatz ist das ich beim Start der Backoffice anwendung eine Methode vom Webservice asynchron aufrufe und diese mich über eingehende Daten informiert und mir diese zurückschickt.

Dazu lass ich im Webservice eine Variable (Flag) dauerhaft in einer while schleife überprüfen. Sobald das Flag gesetzt wird, wird die while schleife verlassen und die Daten werden zurück gegeben. In der BackOffice Anwendung informier ich den Mitarbeiter mit hilfe einer MessageBox über die eingehenden Daten =) ...

--------------------------------------------------------

Da die Integrationssoftware die Daten direkt per XML (SOAP im wsdl Format) an einen Webservice schicken kann denke ich das die Kommunikation über den Webservice am sinvollsten ist. Man könnte die Daten auch in XML files iwo automatisiert ablegen lassen oä. Ich denke aber nicht das dies unbedingt besser ist - vor allem da die Daten ja eher Temporär in der Backoffice Anwendung zur Verfügung stehen müssen (Kontrolle durch den Mitarbeiter).

--------------------------------------------------------

Am liebsten würde ich einen Methodenaufruf in meiner lokalen Anwendung duch den Webservice auslösen lassen, da mir die While Schleife im Webservice nicht wirklich gefällt ^^. Doch dazu hab ich bis jetzt keine Möglichkeit gefunden. Was meint Ihr dazu?

Viele Grüße
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Mi 30.09.09 16:19 
Auf der msdn steht folgendes: msdn.microsoft.com/e...d1e5%28VS.80%29.aspx

Sieht für mich nach dem aus was du brauchst - habs nicht getestet :)

Gruß Daniel
CurdledMilk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: Do 01.10.09 09:01 
Ich habe mal ein kleines bsp. erstellt nach welchem schema ich verfahre:

Webservice -->

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
    public class Service1 : System.Web.Services.WebService
    {
        static private string myString = "";

        [WebMethod]
        public string HelloWorld() //einfache string rückgabe funktion
        {
            myString = "";

            while ( myString.Equals(""))
            {

                Thread.Sleep(2000); //damit die cpu auslastung nicht bei 99% liegt        

            } 
            
            return myString;   
        }

        [WebMethod]
        public void setMyString(string eingabe)
        {
            myString = eingabe; //methode zum setzen des strings -- hello world wird damit beendet 

        }

    }


Client -->

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        private static MyDelegate del;


        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Service1 SendenService = new Service1(); //Proxy Klasse erzeugen    

            del = new MyDelegate(SendenService.HelloWorld); //Delegate von Webservice Methode erstellen
            
            AsyncCallback callback = new AsyncCallback(MyCallbackProc); //asynchrones callback 

            del.BeginInvoke(callback, null); //asynchronen aufruf beginnen 
 
        }

        public static void MyCallbackProc(IAsyncResult ar)
        {
            MessageBox.Show((del.EndInvoke(ar))); //ausgabe einer message box wenn die webservice methode aufgerufen
                                                 //wird (beendet ist)
        } 

        public delegate string MyDelegate(); 

    }
}


kannst ja ma schaun ob das so in etwa dem entspricht was man machen "darf" ... wie gesagt ich find die lösung so nich besonders toll ... aber es funktioniert

edit: Ich habs grad mal etwas länger laufen ... Dann bekomm ich nen Laufzeitfehler wegen nem Timeout ... scheint also doch nie die optimale Lösung zu sein iwie
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Do 01.10.09 17:06 
Wenn Anwendung und Server im gleichen Netzwerk sind, ist ein Webservice unnötig. Es sollte über WCF o.Ä. möglich sein, die Anwendung beim Server als Client zu registrieren und sie dann über neue Daten informieren zu lassen.

_________________
>λ=
CurdledMilk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: Fr 02.10.09 07:58 
danke erst ma für die antwort :)

ich habe auf der Integrationssoftware keinerlei möglichkeiten mir eine neue schnitstelle zu schaffen. Ich hab da nur einen administrativen zugang und kann da halt so sachen auswählen wie nachriten an einen webservice schicken, nachrichten als xml datein hinterlegen etc.

evt. hab ich ja auch falsch verstanden was du meinst :) ... kannst ja noch mal bisl genauer drauf eingehen ...
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Fr 02.10.09 19:05 
Das bezog sich auf deinen Server ;) . Wenn die Integrationssoftware Web-Services braucht, kann man da nichts machen, aber für die Kommunikation zwischen eigenen Komponenten solltest du wirklich Netzwerk-APIs wie WCF verwenden. Damit habe ich mich allerdings noch nie beschäftigt, kann dir dort leider nicht weiterhelfen.

_________________
>λ=