Zum Inhalt springen

.NET Webservices - C#


deathhero
 Teilen

Empfohlene Beiträge

Also:

 

Ich arbeite mit dem MS Visual Studio 2005.

Ich erstelle ein neues ASP.NET Webservice.

Es entstehen 2 Dateien: Service.cs / Service.asmx

 

Code von Service.cs

using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Service : System.Web.Services.WebService
{
   public Service () {
   }

   [WebMethod]
   public string HelloWorld() {
       return "Hello World";
   } 
}

Wenn ich das Projekt ausführe kann ich das Service ohne Probleme testen. Als Resultat bekomme ich folgende XML Datei im Browser angezeigt:


Hello World

Sprich das Service funktioniert.

 

Laut meinem Buch muss ich jetzt meinem Projekt eine Web Referenz hinzufügen(Siehe Bild 1)

Funktioniert tadellos und es entstehen folgende Dateien(Bild 2)

 

Um das Service jetzt von einem anderen Programm aus konsumieren zu können muss man eine Proxy Klasse erstellen.( Wie das im Studio geht, hab ich noch nicht herausbekommen) deshalb gebe ich den Befehl eben in der Konsole ein.

Kompiliert wird mit WSDL.exe

 

Befehl:

wsdl  /o:E:Proxy.cs  http://localhost:3315/WebSite1/Service.asmx?wsdl 

Optimal Proxy Klasse wird erstellt:

Folgender Code:

 

using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Serialization;

/// 
[system.Diagnostics.DebuggerStepThroughAttribute()]
[system.ComponentModel.DesignerCategoryAttribute("code")]
[system.Web.Services.WebServiceBindingAttribute(Name="ServiceSoap", Namespace="http://tempuri.org/")]
public partial class Service : System.Web.Services.Protocols.SoapHttpClientProtocol {

private System.Threading.SendOrPostCallback HelloWorldOperationCompleted;

   /// 
   public Service() {
       this.Url = "http://localhost:3315/WebSite1/Service.asmx";
   }

   /// 
   public event HelloWorldCompletedEventHandler HelloWorldCompleted;

   /// 
   [system.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/HelloWorld", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
   public string HelloWorld() {
       object[] results = this.Invoke("HelloWorld", new object[0]);
       return ((string)(results[0]));
   }

   /// 
   public System.IAsyncResult BeginHelloWorld(System.AsyncCallback callback, object asyncState) {
       return this.BeginInvoke("HelloWorld", new object[0], callback, asyncState);
   }

   /// 
   public string EndHelloWorld(System.IAsyncResult asyncResult) {
       object[] results = this.EndInvoke(asyncResult);
       return ((string)(results[0]));
   }

   /// 
   public void HelloWorldAsync() {
       this.HelloWorldAsync(null);
   }

   /// 
   public void HelloWorldAsync(object userState) {
       if ((this.HelloWorldOperationCompleted == null)) {
           this.HelloWorldOperationCompleted = new System.Threading.SendOrPostCallback(this.OnHelloWorldOperationCompleted);
       }
       this.InvokeAsync("HelloWorld", new object[0], this.HelloWorldOperationCompleted, userState);
   }

   private void OnHelloWorldOperationCompleted(object arg) {
       if ((this.HelloWorldCompleted != null)) {
           System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
           this.HelloWorldCompleted(this, new HelloWorldCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
       }
   }

   /// 
   public new void CancelAsync(object userState) {
       base.CancelAsync(userState);
   }
}
/// 
public delegate void HelloWorldCompletedEventHandler(object sender, HelloWorldCompletedEventArgs e);

/// 
public partial class HelloWorldCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {

   private object[] results;

   internal HelloWorldCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : 
           base(exception, cancelled, userState) {
       this.results = results;
   }

   /// 
   public string Result {
       get {
           this.RaiseExceptionIfNecessary();
           return ((string)(this.results[0]));
       }
   }
}

 

Jetzt erstelle ich ein überhaupt anderes Projekt. Zum Testen eine reine Konsolen Anwendung. Die Proxy Klasse wird in da Projekt eingebunden.

Schaut so aus (Bild3)

 

Mein Testprogramm schaut so aus:

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
   class Program
   {
       static void Main(string[] args)
       {
           try
           {
               Service s1 = new Service();
               Console.WriteLine("Testausgabe: {0}", s1.HelloWorld());
           }
           catch (Exception e)
           {
               Console.WriteLine("Nix geht: {0}",e.GetBaseException());
           }
       }
   }
}

 

Und genau hier liegt mein Problem. Anstatt meine HelloWorld Methode aufzurufen, geht er immer in den catch Teil.

 

Folgende Meldung wird ausgegeben:

Nix geht: System.Net.WebException: The request was aborted: The connection was c
losed unexpectedly.
  at System.Net.ConnectStream.InternalWrite(Boolean async, Byte[] buffer, Int32
offset, Int32 size, AsyncCallback callback, Object state)
  at System.Net.ConnectStream.Write(Byte[] buffer, Int32 offset, Int32 size)
  at System.Xml.XmlUtf8RawTextWriter.FlushBuffer()
  at System.Xml.XmlUtf8RawTextWriter.Flush()
  at System.Xml.XmlWellFormedWriter.Flush()
  at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Obje
ct o, XmlSerializerNamespaces namespaces, String encodingStyle, String id)
  at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Obje
ct o, XmlSerializerNamespaces namespaces, String encodingStyle)
  at System.Web.Services.Protocols.SoapHttpClientProtocol.Serialize(SoapClientM
essage message)
  at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodN
ame, Object[] parameters)
  at Service.HelloWorld() in E:\MATURAPROJEKT 2005-2006\Test\ConsoleApplication
1\Proxy.cs:line 42
  at ConsoleApplication1.Program.Main(String[] args) in E:\MATURAPROJEKT 2005-2
006\Test\ConsoleApplication1\Program.cs:line 14
Drücken Sie eine beliebige Taste . . . 

 

Habe ich da ein Problem mit den Namespaces, oder denke ich eigentlich komplett falsch.

Info: Arbeite mit C# und Webservices erst seit 2 Wochen...:D

 

Sg :wink:

Link zu diesem Kommentar
Auf anderen Seiten teilen

Laut meinem Buch muss ich jetzt meinem Projekt eine Web Referenz hinzufügen(Siehe Bild 1)

Funktioniert tadellos und es entstehen folgende Dateien(Bild 2)

 

Um das Service jetzt von einem anderen Programm aus konsumieren zu können muss man eine Proxy Klasse erstellen.( Wie das im Studio geht, hab ich noch nicht herausbekommen) deshalb gebe ich den Befehl eben in der Konsole ein.

Kompiliert wird mit WSDL.exe

 

 

Webreferenz = Proxy !

und erstellst du im Solution Explorer mittels Web referenz hinzufügen (ist sozusagen ein Assistent welcher WSDSL ausführt und dir gleich einen c#/vb proxy erstellt und in das Projekt einbindet

 

 

lg

werner

Link zu diesem Kommentar
Auf anderen Seiten teilen

Webreferenz = Proxy !

und erstellst du im Solution Explorer mittels Web referenz hinzufügen (ist sozusagen ein Assistent welcher WSDSL ausführt und dir gleich einen c#/vb proxy erstellt und in das Projekt einbindet

 

 

lg

werner

AHA das macht einmal einen Punkt klar!

Ich kann es allerdings mit der Webrefernz auch nicht aufrufen...

 

Projekt ist per Mail zu dir unterwegs...DANKE!!! :U: steht!

 

Und Port: hmm ja müsste eigentlich offen sein...Firwall ist auch ausgeschaltet...

 

sg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

 Teilen

×
×
  • Neu erstellen...