Laden...

WCF Problem mit Metadata

Erstellt von meli_83 vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.458 Views
M
meli_83 Themenstarter:in
12 Beiträge seit 2013
vor 10 Jahren
WCF Problem mit Metadata

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 > Fehlermeldung:

"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

849 Beiträge seit 2006
vor 10 Jahren

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

6.911 Beiträge seit 2009
vor 10 Jahren

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!"

849 Beiträge seit 2006
vor 10 Jahren

Der Metadata exchange ist doch http? Klar, bei net.tcp Klappt das nicht, aber das ist ja auch eher exotisch.

6.911 Beiträge seit 2009
vor 10 Jahren

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!"

M
meli_83 Themenstarter:in
12 Beiträge seit 2013
vor 10 Jahren

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

16.807 Beiträge seit 2008
vor 10 Jahren

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.

M
meli_83 Themenstarter:in
12 Beiträge seit 2013
vor 10 Jahren

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.

6.911 Beiträge seit 2009
vor 10 Jahren

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!"

M
meli_83 Themenstarter:in
12 Beiträge seit 2013
vor 10 Jahren

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

6.911 Beiträge seit 2009
vor 10 Jahren

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!"

M
meli_83 Themenstarter:in
12 Beiträge seit 2013
vor 10 Jahren

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>

6.911 Beiträge seit 2009
vor 10 Jahren

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!"

M
meli_83 Themenstarter:in
12 Beiträge seit 2013
vor 10 Jahren

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

6.911 Beiträge seit 2009
vor 10 Jahren

Hallo meli_83,

jetzt kommen wir der Sache wohl näher.

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!"

M
meli_83 Themenstarter:in
12 Beiträge seit 2013
vor 10 Jahren

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? 😁

6.911 Beiträge seit 2009
vor 10 Jahren

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!"

M
meli_83 Themenstarter:in
12 Beiträge seit 2013
vor 10 Jahren

:'( Der Fehler ist immer noch da. Was mache ich nur falsch ?

6.911 Beiträge seit 2009
vor 10 Jahren

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!"

M
meli_83 Themenstarter:in
12 Beiträge seit 2013
vor 10 Jahren

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?

M
meli_83 Themenstarter:in
12 Beiträge seit 2013
vor 10 Jahren

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?

16.807 Beiträge seit 2008
vor 10 Jahren

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.