Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
WCF Problem mit Metadata
meli_83
myCSharp.de - Member



Dabei seit:
Beiträge: 13

Themenstarter:

WCF Problem mit Metadata

beantworten | zitieren | melden

Hallo an alle,

ich programmiere zum ersten Mal eine WCF-Anwendung. Sobald ich bei der Interface einen komplexen Datentyp aufrufe( von einer Klasse, die bereits vorhanden ist), taucht diese Fehlermeldung auf
Fehler
"Failed to add a service. Service metadata may not be accessible. Make sure your service is running and exposing metadata."
Seit paar Tagen hänge ich auch daran und bin langsam verzweifelt, da ich alle Vorschläge vom Internet umgesetzt habe und es hat nichts gebracht.
Ich habe die Klasse serialisiert, es hat nichts gebracht. Ich weiß aber auch nicht ob ich das mit der Serialisierung gut verstanden habe.

Auf eure Hilfe und Vorschläge freue ich mich.

LG
meli
private Nachricht | Beiträge des Benutzers
unconnected
myCSharp.de - Member

Avatar #avatar-3200.jpg


Dabei seit:
Beiträge: 862
Herkunft: Oerlinghausen/NRW

beantworten | zitieren | melden

Hallo Meli,

ich habe Probleme zu verstehen wo es nun wirklich hakt. Die Fehlermeldung sagt das beim hinzufügen des Service etwas schief geht, Du sagst aber das beim Aufruf des Service etwas schiefgeht.

Kannst Du den Service den im Browser aufrufen?

Meist benutze ich Fiddler um herauszufinden was wirklich schiefgeht. Wenn Du mit WCF arbeitest fast ein muss.

Grüße
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7561
Herkunft: Waidring

beantworten | zitieren | melden

Hallo meli_83,

ich versteh auch nicht ganz wo das Problem herkommt, da wesentliche Teile für die Analyse fehlen. Kannst du den Service-Contract und die app.config posten?


Hallo unconnected,

Fiddler ist super, geht aber nur bei Http-basierten Bindungen. Sonst ist (für mich) WCF-Tracing das Mittel der Wahl.


mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
private Nachricht | Beiträge des Benutzers
unconnected
myCSharp.de - Member

Avatar #avatar-3200.jpg


Dabei seit:
Beiträge: 862
Herkunft: Oerlinghausen/NRW

beantworten | zitieren | melden


Der Metadata exchange ist doch http? Klar, bei net.tcp Klappt das nicht, aber das ist ja auch eher exotisch.
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7561
Herkunft: Waidring

beantworten | zitieren | melden

Hallo unconnected,

MetadataExchange geht bei allen Bindungen. Dann könnte z.B. in VS per Add Service-Reference bei der Addresse net.tcp://.... eingegeben werden.
Dazu muss beim Service der Metadata-Endpoint aber hinzugefügt werden (<endpoint kind="metadata" wenn ich mich jetzt nicht täusche).

Ich seh das aber eher als exotisch an.

mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
private Nachricht | Beiträge des Benutzers
meli_83
myCSharp.de - Member



Dabei seit:
Beiträge: 13

Themenstarter:

beantworten | zitieren | melden

Hi, Danke für die schnellen Antworten. @gfoidl: ich habe leider Service-Contract und die app.config bei meinem Rechner an der Uni, ich habe kann das im moment nicht posten.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ServiceModel;

namespace HelloWorldService
{
    [ServiceContract]
    public interface IHelloWorldService
    {
        [OperationContract]
        string GetMessage(string name);
    }
}

wenn ich dann wie oben einfache Datentypen wie "string", "int" benutze funktioniert das gut, d.h. ich kann mein SErvice starten.

Sobald ich eine neue Methode definiere wie folgt:

[OperationContract]
        Klasseblabla lodFile(string path);

dann taucht das Problem auf. Irgendeine Idee?

Ansonsten werde ich Morgen mein app.config noch hier hochladen.

Danke im Voraus.
LG
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von meli_83 am .
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16145

beantworten | zitieren | melden

Du kannst nicht einfach so eine Klasse übertragen lassen wollen.
Es ist nötig dem "WCF" bekannt zu machen, was was ist. Dazu gibts die Attribute DataContract und DataMember und Serializable.

Nen Tutorial ausführlich durch zu arbeiten macht bei neuen Technologien immer sinn.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
meli_83
myCSharp.de - Member



Dabei seit:
Beiträge: 13

Themenstarter:

beantworten | zitieren | melden

Welches Tutorial könntest Du mir empfehlen, ich google seit paar Tagen und finde diesbezüglich nichts. Ich arbeite in .net 4.5 Umgebung.

Ich wäre Euch dankbar, wenn ihr mir Tipps geben könnt.
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7561
Herkunft: Waidring

beantworten | zitieren | melden

Hallo Abt,

DataContract war eigentlich nur in der ersten Version von WCF nötige, ab .net 3.5 SP1 serialisiert der Serializer bei den Klassen die (öffentlichen) Eigenschaften - ähnlich wie der XmlSerializer - und daher kann der DataContract ruhig entfallen ohne Probleme zu haben.

Aber Zwecks Versionierung vom Service sollte nicht einfach so der Contract erweitert werden. Siehe Service Versioning


Hallo meli_83,

tritt das Problem dann beim Starten vom Service auf od. beim Client-Zugriff?
Letzteres wäre verständlich, da der Client auch aktualisiert werden muss - dieser kennt den neuen Contract ja noch nicht.

mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
private Nachricht | Beiträge des Benutzers
meli_83
myCSharp.de - Member



Dabei seit:
Beiträge: 13

Themenstarter:

beantworten | zitieren | melden

Hallo gfoidl,

das Problem tritt so bald ich das Sevice starten möchte.
Ich hoffe Du hast eine Lösung für mich :(

LG
meli
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7561
Herkunft: Waidring

beantworten | zitieren | melden

Hallo meli_83,

so ist mir das Problem nicht bekannt, daher häng dein Projekt an - falls du es dann hast - und ich schaus mir an was das faul(t) ist.

mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
private Nachricht | Beiträge des Benutzers
meli_83
myCSharp.de - Member



Dabei seit:
Beiträge: 13

Themenstarter:

beantworten | zitieren | melden

Hallo gfoidl,

hier mein Service-Contract und das app.config. BaseX ist eine Klasse, die sich in SolutionX.Y befindet. Ich hoffe du findest das Problem

Danke


using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using SolutionX;
using SolutionX.Y;

namespace Example
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IExampleService" in both code and config file together.
    [ServiceContract]
    public interface IExampleService
    {
        [DataMember]
        BaseX file { get; set; }

        [OperationContract]
        string getname(string name);
        [OperationContract]
       // [WebInvoke(Method = "POST", UriTemplate = "FileUpload/{fileName}")]
        string FileLoad( string path);
        [OperationContract]
        BaseX loadfile(string path);
    }
}

<?xml version="1.0"?>
<configuration>

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5"/>
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
        <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <!--
        To browse web app root directory during debugging, set the value below to true.
        Set to false before deployment to avoid disclosing web app folder information.
      -->
    <directoryBrowse enabled="true"/>
  </system.webServer>

</configuration>
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7561
Herkunft: Waidring

beantworten | zitieren | melden

Hallo meli_83,

da ist nichts verdächtiges drin und lässt sich so auch nicht reproduzieren. Irgendwo ist da etwas fault. Probier mal eine Vorgehensweise wie in [Tutorial] Vertrackte Fehler durch Vergleich von echtem Projekt mit minimalem Testprojekt finden beschrieben od. häng das Projekt komplett an.

mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
private Nachricht | Beiträge des Benutzers
meli_83
myCSharp.de - Member



Dabei seit:
Beiträge: 13

Themenstarter:

beantworten | zitieren | melden

Hallo,

das Problem geschieht nur wenn ich der Typ der Klasse BaseX aufrufe, der sich in SolutionX.Y befindet. Wenn ich aber eine Klasse erzeuge, die auch im gleichen Ordner wie meine WEbServce liegt und der Typ der Klasse bei meinem Service-Contract aufrufe, dann geschieht diese Fehlermeldung nicht mehr.

Irgendeine Idee wie ich der Typ BaseX aufrufe ohne dass, ich immer auf diesen Fehler gestoßen werden? soll ich wahrscheinlich die Klasse serialisieren? (ich weiß aber nicht genau wie man eine Klasse serialisiert, zumal dass es um eine risige Klasse handelt, die ich nicht geschrieben habe ).

@gfoidl irgendwelche Vorschläge bitte.

Auf eure Meinung würde ich mich freuen!
Liebe Grüße
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von meli_83 am .
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7561
Herkunft: Waidring

beantworten | zitieren | melden

Hallo meli_83,

jetzt kommen wir der Sache wohl näher.
Zitat
soll ich wahrscheinlich die Klasse serialisieren?
Das ist für mich mal der entscheidende Hinweis. Der Typ muss entweder primitiv (string, int, usw.) od. serialisierbar sein. D.h. die BaseX-Klasse muss mit dem [Serializable]-Attribut versehen sein, damit WCF bzw. deren Serialisierer damit umgehen kann. Probier das mal aus.

mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
private Nachricht | Beiträge des Benutzers
meli_83
myCSharp.de - Member



Dabei seit:
Beiträge: 13

Themenstarter:

beantworten | zitieren | melden

Sorry, was soll ich ausprobieren? die Klasse zu Serialisieren meinst Du?
Wie geht das wenn ich fragen darf? hast du da irgendein Beispiel für mich?
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7561
Herkunft: Waidring

beantworten | zitieren | melden

Hallo meli_83,

hab ich doch eh geschrieben:


[Serializable]
public class BaseX
{
    ...
}


mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
private Nachricht | Beiträge des Benutzers
meli_83
myCSharp.de - Member



Dabei seit:
Beiträge: 13

Themenstarter:

beantworten | zitieren | melden

:'( Der Fehler ist immer noch da. Was mache ich nur falsch ?
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7561
Herkunft: Waidring

beantworten | zitieren | melden

Hallo meli_83,

häng das Projekt hier an, dann kann ich schauen.

mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
private Nachricht | Beiträge des Benutzers
meli_83
myCSharp.de - Member



Dabei seit:
Beiträge: 13

Themenstarter:

beantworten | zitieren | melden

Ja toll, die Datei lässt sich nicht hochladen "Es sind Fehler beim Hochladen aufgetreten. Bitte überprüfe Deine Eingaben.". Obwohl es sich um eine .zip Datei handelt. Gibt irgend eine Möglichkeit die Datei hozuladen?
private Nachricht | Beiträge des Benutzers
meli_83
myCSharp.de - Member



Dabei seit:
Beiträge: 13

Themenstarter:

beantworten | zitieren | melden

Die Datei ist viel zu groß wegen den References, die ich hinzugefügt habe.
Eigentlich außer Service-Contract und das app.config, die ich gepostet habe, alles andere betrifft die BaseX-klasse. Nun muss ich nur wissen warum diese Klasse sich nicht serialisieren lässt. irgendeine Idee?
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16145

beantworten | zitieren | melden

Wenn Du uns die Klasse und deren Relationen zu anderen Klassen nicht vollständig zeigst, dann wird Dir wohl keiner wirklich helfen können.
Wir haben leider keine Glaskugel.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers