C# Konsolenanwendung läuft, als Webservice klappts aber nicht
-
Stell Dir den Webservice als eine Klasse vor.
Hast Du eine Klasse in Deinem Projetzt muss Du auch eine Instanz erzeugen.
Das gleiche machst Du bei einem Webservice.Als Webverweis hinzufügen (im Projekt der Webseite), Proxy wird generiert.
In der Codebehind der Webseite (nicht Webservice) dann den Webservice behandeln wie eine Klasse.
-
Die Referenz war falsch, ja.
Habe nun auf der Webseite die Referenz auf den Webservice eingerichtet.http://s1.directupload.net/file/d/2799/nmti8t8e_jpg.htm
Jetzt kann ich aber noch immer keine Instanz der Klasse ChannelService erstellen.
type or namespace ChannelService could not be found ...
über using kann ich auch nix passendes finden.
namespace bei webseite und webservice ist der selbe.Woran kann des denn jetzt liegen?
-
Wenn ich nicht irre müsstest du mittels localhost.ChannelService an die Klasse herankommen.
// Ich erstell mir meist die Proxyklasse per Visual Studio eingabeaufforderung unter Verwendung des wsdl Befehls.
Falls alle stricke reisen, kannst du dir das ja mal ansehen. Der genaue Befehl wäre "wsdl http://webserviceurl".
Dabei würde dir dann eine Klasse erstellt, die du deinem Projekt nur noch hinzufügen musst. Anschließend kannst du dann auf alle Member zugreifen und so auf den Webservice zugreifen.
-
also der webservice kann nun von der webseite aus gestartet werden.
folgende methode wird aufgerufen:[WebMethod] public string HelloWorld() { Service1 cs = new Service1(); cs.xmlDownloaden(cs.username, cs.pw, cs.filename); cs.removeDtd(cs.filename); cs.xmlToArray(cs.filename); return "Müsste alles geklappt haben"; }
Änder ich z.B. den Usernamen absichtlich in einen falschen Wert,
bekomme ich natürlich eine Exception zurück gegeben.Sind die Werte allerdings richtig, wird das return-Statement korrekt zurück gegeben.
Allerdings klappt der rest nicht.
Ich müsste doch jetzt im /bin eine überarbeitete .xml-Datei haben wie sie die Konsolenanwendung auch erzeugt oder nicht?
-
hier nochmal der aktuelle Quellcode der Service1.asmx.cs:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Services; using System.Net; using System.IO; using System.Xml; namespace WebService3 { /// <summary> /// Summary description for Service1 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. // [System.Web.Script.Services.ScriptService] public class Service1 : System.Web.Services.WebService { //URL für das XML-Doc private string url = "..."; //Username zum Login für das XML-Doc private string username = "..."; //Passwort zum Login für das XML-Doc private string pw = "..."; //Name unter dem das XML-Doc gespeichert werden soll private string filename = "channel.xml"; [WebMethod] public string HelloWorld() { Service1 cs = new Service1(); cs.xmlDownloaden(cs.username, cs.pw, cs.filename); cs.removeDtd(cs.filename); cs.xmlToArray(cs.filename); return "Müsste alles geklappt haben"; } public void xmlDownloaden(string username, string password, string filename) { WebClient myClient = new WebClient(); myClient.Credentials = new System.Net.NetworkCredential(username, password); myClient.DownloadFile(url, filename); } public void removeDtd(string filename) { StreamReader inputStreamReader = File.OpenText(filename); String Inhalt = inputStreamReader.ReadToEnd(); inputStreamReader.Close(); String ersetzen = "<!DOCTYPE "; String durch = "<!--"; Inhalt = Inhalt.Replace(ersetzen, durch); StreamWriter outputStreamWriter = File.CreateText(filename); outputStreamWriter.Write(Inhalt); outputStreamWriter.Close(); inputStreamReader = File.OpenText(filename); Inhalt = inputStreamReader.ReadToEnd(); inputStreamReader.Close(); ersetzen = ".dtd\">"; durch = "-->"; Inhalt = Inhalt.Replace(ersetzen, durch); outputStreamWriter = File.CreateText(filename); outputStreamWriter.Write(Inhalt); outputStreamWriter.Close(); } public Channel[] xmlToArray(string filename) { int anzahlChannels = 1; using (XmlReader tmp = XmlReader.Create(new StringReader(ReadXmlFile(filename)))) { while (tmp.Read()) { if (tmp.ReadToFollowing("Party")) { anzahlChannels++; } } } Channel[] channelArray = new Channel[anzahlChannels]; for (int i = 0; i < channelArray.Length; i++) { channelArray[i] = new Channel(); } using (XmlReader reader = XmlReader.Create(new StringReader(ReadXmlFile(filename)))) { int channelIndex = 0; while (reader.Read()) { try { if (reader.ReadToFollowing("Party")) { channelArray[channelIndex].setParty(reader.ReadElementContentAsString()); } if (reader.ReadToFollowing("Service")) { channelArray[channelIndex].setService(reader.ReadElementContentAsString()); } if (reader.ReadToFollowing("ChannelName")) { channelArray[channelIndex].setChannelName(reader.ReadElementContentAsString()); } if (reader.ReadToFollowing("ChannelID")) { channelArray[channelIndex].setChannelID(reader.ReadElementContentAsString()); } if (reader.ReadToFollowing("ActivationState")) { channelArray[channelIndex].setActivationState(reader.ReadElementContentAsString()); } if (channelArray[channelIndex].getActivationState() == "STARTED") { if (reader.ReadToFollowing("ChannelState")) { channelArray[channelIndex].setChannelState(reader.ReadElementContentAsString()); } } } catch (Exception e) { Console.WriteLine("Exception: " + e); } channelIndex++; } } return channelArray; } public string ReadXmlFile(string filename) { string Content = ""; if (File.Exists(filename)) { StreamReader myFile = new StreamReader(filename, System.Text.Encoding.Default); Content = myFile.ReadToEnd(); myFile.Close(); } return Content; } } public class Channel { private string channel = null; private string party = null; private string service = null; private string channelName = null; private string channelID = null; private string activationState = null; private string channelState = null; public Channel() { this.channel = ""; this.party = ""; this.service = ""; this.channelName = ""; this.channelID = ""; this.activationState = ""; this.channelState = ""; } public string getChannel() { return this.channel; } public void setChannel(string _channel) { this.channel = _channel; } public string getParty() { return this.party; } public void setParty(string _party) { this.channel = _party; } public string getService() { return this.service; } public void setService(string _service) { this.service = _service; } public string getChannelName() { return this.channelName; } public void setChannelName(string _channelName) { this.channelName = _channelName; } public string getChannelID() { return this.channelID; } public void setChannelID(string _channelID) { this.channelID = _channelID; } public string getActivationState() { return this.activationState; } public void setActivationState(string _activationState) { this.activationState = _activationState; } public string getChannelState() { return this.channelState; } public void setChannelState(string _channelState) { this.channelState = _channelState; } } }
und der quellcode der Default.aspx.cs:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { localhost.Service1 s = new localhost.Service1(); s.HelloWorld(); } }
-
Wird denn eine Exception geworfen? - Denn Grundlegend gehe ich momentan davon aus, dass der Webservice es in C:\Windows\System32 speichern will. Hier müsstest du den Speicherpfad intelligent angeben entweder durch angabe des vollen Pfades oder aber durch Ermittlung des Website / Webservicepfades.
// EDIT:
Wofür brauchst du die Service1 Instanz im Hello World? - Du hast doch Zugriff auf die Methoden mittels this.
-
boah ich spring gleich ausem fenster^^
hat alles geklappt nur wurde die channel.xml unter "C:\Program Files\Common Files\Microsoft Shared\DevServer\10.0" abgelegt.
Ich habe die ganze Zeit im Workspace unter ...\My Documents\Visual Studio 2010\Projects\WebService3 auf die Datei gewartet
hätte mir ja auch mal früher einfallen können den pc nach der datei zu durchsuchen -.-
waaaaaaaaaaaaaaaaaaaaaaaaaa
Die Service1 Instanz im Hello World macht so wie der Webservice im Moment aussieht nicht viel Sinn, das stimmt.
Da die Grundlagen nun funktionieren werden aber noch einige Features hinzu kommen, bei denen es evtl. wichtig sein wird die Objekte wieder zu zerstören wenn der Webservice noch läuft.
Vielen Dank für deine Hilfe!!!!!
-
hallo,
ich bin irgendwie nicht in der Lage, Quelltext schön formatiert einzufügen:
using System; using System.Collections.Generic; using System.Linq; using System.Text;
was mache ich falsch?
Hat jemand eine Ahnung?
Danke
mgvsry, dass ich den Thread missbrauche
-
mgv schrieb:
hallo,
ich bin irgendwie nicht in der Lage, Quelltext schön formatiert einzufügen:
using System; using System.Collections.Generic; using System.Linq; using System.Text;
was mache ich falsch?
Hat jemand eine Ahnung?
Danke
mgvsry, dass ich den Thread missbrauche
Was auch immer du da getan hast, ich zitiere nur! und es wird formatiert angezeigt.
-
habs, bbcode muss aktiviert sein.
was auch immer mit BBcode gemeint ist.
Danke für die Antwort.