Autor Beitrag
ironhaert
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Di 03.08.10 08:59 
Hi an alle,
ich habe ein kleines Problem mit der Bereitstellung von Metadaten für einen WCF-Dienst.
Das ganze hat vor 1-2 Wochen noch einwandfrei funktioniert.
Nun bekomme ich folgende Meldung auf der Metadaten-Url:

Zitat:
Der Client konnte die Anforderung aufgrund eines internen Fehler nicht verarbeiten. Wenn Sie weitere Informationen zum Fehler erhalten möchten, aktivieren Sie entweder IncludeExceptionDetailInFaults (entweder über das ServiceBehaviorAttribute oder das <serviceDebug>-Konfigurationsverhalten) für den Client, um die Ausnahmeinformationen zurück an den Server zu senden, oder aktivieren Sie die Ablaufverfolgung gemäß der Microsoft .NET Framework 3.0 SDK-Dokumentation, und prüfen Sie die Serverablaufverfolgungsprotokolle.


Hier mein Servercode:
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
    
public class TestServer
    {
        public TestServer(Form window, object test)
        {
            RichTextBox rtb = (RichTextBox)window.Controls["rtbMessages"];
            try
            {
                Uri uri1 = new Uri(window.Controls["txtAddressField1"].Text);

                ServiceHost host = new ServiceHost(new clsWcfServices(test), uri1);
                NetTcpBinding binding = new NetTcpBinding();
                host.AddServiceEndpoint(typeof(ifc1), binding, uri1);
                host.AddServiceEndpoint(typeof(ifc2), binding, uri1);

                #region Metadata for the Service
#if DEBUG
                ServiceMetadataBehavior smb = host.Description.Behaviors.Find<ServiceMetadataBehavior>();
                if (smb == null)
                {
                    smb = new ServiceMetadataBehavior();
                    host.Description.Behaviors.Add(smb);
                }
                smb.HttpGetEnabled = true;
                Uri urimex = new Uri("http://localhost:4713/mex");
                smb.HttpGetUrl = urimex;
                rtb.AppendText("Servicemetadata are available under: " + urimex + "\n");
#endif
                #endregion

                host.Open();
                rtb.AppendText("File and Job Services are available under: " + uri1 + "\n");
                rtb.AppendText("Server was started correctly!\n");
            }
            #region catch&finally
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
                throw;
            }
            finally
            {

            }
            #endregion

        }
    }


Hat jemand ne Ahnung was hier falsch läuft bzw. was die Ursache hierfür sein kann?
Kann mir jemand sagen wie der Fehler zu beheben ist?

gruß ironhaert
ironhaert Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Di 03.08.10 11:00 
Also ich habe mittlerweile rausgefunden, dass es ziemlich sicher an den Interfaces liegt.
Da die Interfaces selbsterzeugte Typen verwende, welche wiederum selbsterzeugte Typen als Felder verwenden mussten diese Typen ja dem Contract zwecks Serialisierung als ServiceKnownType mitgegeben werden.
Ersezte ich alle diese Objekte innerhalb der Interfaces durch Standardklassen der .NET-Lib, so funktioniert die Bereitstellung der Metadaten. Ansonsten nicht.
Hat jemand ne Idee was nun wirklich falsch ist oder fehlen könnte? Weil, auch ohne Serialisierung funktionierte die Bereitstellung der Metatdaten bisher immer.
ironhaert Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Di 03.08.10 13:04 
FEHLER GEFUNDEN.
Wie es genau dazu kommt muss ich allerdings auch noch erst genauer recherchieren.

Entstanden ist der Fehler wie folgt:
Innerhalb einer der Typen, welche ich in den Interfaces für die Kommunikation verwende, ist ein Feld, das ein Typ aus einer Thrid-Party-Dll verwendet. Das Feld hatte ich nun als Datamember inerhalb des Datenvertrags gekennzeichnet.
Ohne diese Kennzeichnung funktioniert die Bereitstellung der Metadaten.

Da das Feld allerdings auch mit diesem Typ noch serialisiert zu Verfügung gestellt werden muss, muss ich erst noch genauer nachschauen, wo der Fehler liegt bzw. ob evlt. Anpassungen in der Thrid-Party-Dll vorgenommen werden müssen.

grüße ironhaert