PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : .NET Webservices - C#



deathhero
06-10-2005, 16:01
Hi,

So noch eine Frage von mir.
Arbeitet jemand hier im Forum mit .NET Webservices(vorzugsweise in C# programmiert)
Denn dazu hätte ich auch noch eine kleine Frage, welche mir noch keiner so richtig beantworten konnte.

sg

eleon
06-10-2005, 16:04
was willst wissen? kann jemand aus meinem team fragen.

oder eventuell sogar selbst beantworten :o (aber wozu gibts fussvolk :devil: )

deathhero
06-10-2005, 16:06
optimal..... moment...ich such nur den ganzen code zusammen :D

werner5
06-10-2005, 16:28
Da hamma ja genug experten beisammen...

ich kann wahrscheinlich auch helfen...

lg
werner5

deathhero
06-10-2005, 16:45
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:


<?xml version="1.0" encoding="utf-8" ?>
<string xmlns="http://tempuri.org/">Hello World</string>

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;

/// <remarks/>
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Web.Services.WebServiceBindingAttribute(Nam e="ServiceSoap", Namespace="http://tempuri.org/")]
public partial class Service : System.Web.Services.Protocols.SoapHttpClientProtoc ol {

private System.Threading.SendOrPostCallback HelloWorldOperationCompleted;

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

/// <remarks/>
public event HelloWorldCompletedEventHandler HelloWorldCompleted;

/// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAt tribute("http://tempuri.org/HelloWorld", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse .Literal, ParameterStyle=System.Web.Services.Protocols.SoapP arameterStyle.Wrapped)]
public string HelloWorld() {
object[] results = this.Invoke("HelloWorld", new object[0]);
return ((string)(results[0]));
}

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

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

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

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

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

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

/// <remarks/>
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;
}

/// <remarks/>
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(X mlWriter xmlWriter, Obje
ct o, XmlSerializerNamespaces namespaces, String encodingStyle, String id)
at System.Xml.Serialization.XmlSerializer.Serialize(X mlWriter xmlWriter, Obje
ct o, XmlSerializerNamespaces namespaces, String encodingStyle)
at System.Web.Services.Protocols.SoapHttpClientProtoc ol.Serialize(SoapClientM
essage message)
at System.Web.Services.Protocols.SoapHttpClientProtoc ol.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:

eleon
06-10-2005, 17:01
bist dir sicher dass das webservice erreichbar ist? -> port?

werner5
06-10-2005, 17:02
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

deathhero
06-10-2005, 17:16
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