Announcement

Collapse
No announcement yet.

ServiceHost Start nicht wegen IMedadataexchange

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • ServiceHost Start nicht wegen IMedadataexchange

    [edit = gfoidl] Siehe auch http://entwickler-forum.de/showthread.php?p=203458


    hallo,

    ich habe einen Service (der Name HalloService) in WCF geschrieben. Nach dem Ich mit Service Konfiguration Editor der App.config generiert habe, habe ich versucht, den Host zu starten. Leider gibt mir folgenden Fehler aus:
    Der Vertragsname "IMetadataExchange" wurde nicht in der Liste der Verträge gefunden, die vom Dienst HalloService implementiert wurden. Fügen Sie der Konfigurationsdatei oder dem ServiceHost direkt ein ServiceMetadataBehavior hinzu, um die Unterstützung für diesen Vertrag zu ermöglichen.
    meine Konfig sieht so aus:
    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
        <system.serviceModel>
            <bindings />
            <behaviors>
                <serviceBehaviors>
                    <behavior name="HalloServiceBehavior">
                        <serviceMetadata httpGetEnabled="true"  />
                    </behavior>
                </serviceBehaviors>
            </behaviors>
            <services>
                <service name="HallService.HalloService">
                    <endpoint address="http://IP:9001/" binding="wsDualHttpBinding"
                        bindingConfiguration="" name="MyDuaLHTTP" contract="Contracts.IHelloService" />
                    <endpoint address="net.tcp://IP:9002/" binding="netTcpBinding"
                        bindingConfiguration="" name="MyTCP" contract="Contracts.IHelloService" />
                    <endpoint address="mex" binding="mexHttpBinding" 
                        contract="IMetadataExchange" />
                    <host>
                        <baseAddresses>
                            <add baseAddress="http://IP:9000/HalloService.svc" />
                        </baseAddresses>
                    </host>
                </service>
            </services>
        </system.serviceModel>
    </configuration>

    Könntet Ihr mir einen Tipp geben, was ich ändern sollte?

    Gruss

    Burkut
    Zuletzt editiert von gfoidl; 08.09.2009, 18:39. Reason: Moderation

  • #2
    Hallo,

    warum orientierts du dich nicht an meinem Beispiel bzw. deren Konfig?

    Für alle anderen hier eine beispielhaft Konfig des ServiceHost. Insbesondere der Endpunkt "MEX" (für Metadata-Exchange) und der Behaviours-Abschnitt:
    [highlight=xml]
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
    <!-- Dienstkonfigurationsdatei mit aktivierter Veröffentlichung von Metadaten. -->
    <system.serviceModel>
    <services>
    <!--
    Hinweis: Der Dienstname muss dem Konfigurationsnamen für die
    Dienstimplementierung entsprechen.
    -->
    <service name="gfoidl.Test.WCF.Service.Calculate"
    behaviorConfiguration="CalculateBehaviors">
    <endpoint address="http://localhost:8085"
    binding="basicHttpBinding"
    contract="gfoidl.Test.WCF.Contract.ICalculate"
    name="Calculate_HTTP"/>
    <endpoint address="net.tcp://localhost:8086"
    binding="netTcpBinding"
    contract="gfoidl.Test.WCF.Contract.ICalculate"
    name="Calculate_TCP"/>
    <!--
    Hinweis: Der Dienst muss über eine HTTP-Basisadresse verfügen,
    um diesen Endpunkt hinzuzufügen.
    -->
    <endpoint contract="IMetadataExchange"
    binding="mexHttpBinding"
    address="mex" />
    <host>
    <baseAddresses>
    <add baseAddress="http://localhost:8087/Calculate.svc"/>
    </baseAddresses>
    </host>
    </service>
    </services>
    <!--Verhaltenskonfiguration-->
    <behaviors>
    <serviceBehaviors>
    <behavior name="CalculateBehaviors" >
    <serviceMetadata httpGetEnabled="false" />
    </behavior>
    </serviceBehaviors>
    </behaviors>
    </system.serviceModel>
    </configuration>
    [/highlight]


    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Hallo,
      warum orientierts du dich nicht an meinem Beispiel bzw. deren Konfig?
      naja, weil ich die Kommunikation zwischen Rechnern im Internet nicht hingekriegt habe, seit zwei Tagen beschäftige ich mich wie verrückt , leider hat es nicht geklappt. Dann habe ich gedacht, dass ich eine neues Beispiel bei mir erstelle und so teste. Somit ginge es auch Schief.
      Ich habe immer wieder folgende Fehlermeldungen (siehe Anhang)bekommen.
      UserPrincipalName sind auch richtig. Also Computername/Nutzer(Admin)
      ich habe sogar alle Ports 9000,9001,9002 in beiden Rechnern freigeschaltet.
      Es funktioniert nicht. Ich brauche jede Hile bitte.


      HTML Code:
      Inner Eception Message: Die Verbindung mit dem Remoteserver kann nicht hergestellt werden. Es konnte keine Verbindung mit "http://ServerIP:9001/" hergestellt werden. TCP-Fehlercode 10061: Es konnte keine Verbindung hergestellt werden, da  der Zielcomputer die Verbindung verweigerte ServerIP:9001.Sorce war: mscorlib 
      Server stack trace:   bei System.ServiceModel.Security.IssuanceTokenProviderBase`1.DoNegotiation(Ti
      meSpan timeout)   bei System.ServiceModel.Security.SspiNegotiationTokenProvider.OnOpen(TimeSpan
       timeout)   bei System.ServiceModel.Security.WrapperSecurityCommunicationObject.OnOpen(TimeSpan timeout)   bei System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
         bei System.ServiceModel.Security.CommunicationObjectSecurityTokenProvider.Ope
      n(TimeSpan timeout)   bei System.ServiceModel.Security.SecurityUtils.OpenTokenProviderIfRequired(Se
      curityTokenProvider tokenProvider, TimeSpan timeout)   bei System.ServiceModel.Security.SymmetricSecurityProtocol.OnOpen(TimeSpan ti
      meout)   bei System.ServiceModel.Security.WrapperSecurityCommunicationObject.OnOpen(TimeSpan timeout)   bei System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
         bei System.ServiceModel.Channels.SecurityChannelFactory`1.ClientSecurityChann
      el`1.OnOpen(TimeSpan timeout)   bei System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
         bei System.ServiceModel.Security.SecuritySessionSecurityTokenProvider.DoOpera
      tion(SecuritySessionOperation operation, EndpointAddress target, Uri via, SecurityToken currentToken, TimeSpan timeout)   bei System.ServiceModel.Security.SecuritySessionSecurityTokenProvider.GetToke
      nCore(TimeSpan timeout)   bei System.IdentityModel.Selectors.SecurityTokenProvider.GetToken(TimeSpan ti
      meout)   bei System.ServiceModel.Security.SecuritySessionClientSettings`1.ClientSecuri
      tySessionChannel.OnOpen(TimeSpan timeout)   bei System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
         bei System.ServiceModel.Channels.ReliableChannelBinder`1.ChannelSynchronizer.
      SyncWaiter.TryGetChannel()   bei System.ServiceModel.Channels.ReliableChannelBinder`1.ChannelSynchronizer.
      SyncWaiter.TryWait(TChannel& channel)   bei System.ServiceModel.Channels.ReliableChannelBinder`1.ChannelSynchronizer.
      TryGetChannel(Boolean canGetChannel, Boolean canCauseFault, TimeSpan timeout, MaskingMode maskingMode, TChannel& channel)   bei System.ServiceModel.Channels.ReliableChannelBinder`1.Send(Message message, TimeSpan timeout, MaskingMode maskingMode)   bei System.ServiceModel.Channels.SendReceiveReliableRequestor.OnRequest(Message request, TimeSpan timeout, Boolean last)   bei System.ServiceModel.Channels.ReliableRequestor.Request(TimeSpan timeout)
         bei System.ServiceModel.Channels.ClientReliableSession.Open(TimeSpan timeout)   bei System.ServiceModel.Channels.ClientReliableDuplexSessionChannel.OnOpen(Ti
      meSpan timeout)   bei System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
         bei System.ServiceModel.Channels.ServiceChannel.OnOpen(TimeSpan timeout)
      Hier ist Server Config:

      HTML Code:
       <?xml version="1.0" encoding="utf-8" ?>
      <configuration>
        <system.serviceModel>
          <services>
            <service  name="HallService.HalloService"
      					 behaviorConfiguration="HalloServiceBehaviors">
              <endpoint address="http://ServerIP:9001/"
      						  binding="wsDualHttpBinding"
      						  contract="Contracts.IHelloService"
      						  name="HelloService_HTTP"/>
              <endpoint address="net.tcp://ServerIP:9002/"
      						  binding="netTcpBinding"
      						  contract="Contracts.IHelloService"
      						  name="HelloService_TCP"/>
              <endpoint contract="IMetadataExchange"
      						  binding="mexHttpBinding"
      						  address="mex" />
              <host>
                <baseAddresses>
                  <add baseAddress="http://ServerIP:9000/HalloService.svc"/>
                </baseAddresses>
              </host>
            </service>
          </services>
          <behaviors>
            <serviceBehaviors>
              <behavior name="HalloServiceBehaviors" >
                <serviceMetadata httpGetEnabled="true" />
              </behavior>
            </serviceBehaviors>
          </behaviors>
        </system.serviceModel>
      </configuration>
      Hier ist Client Config:

      HTML Code:
         <?xml version="1.0" encoding="utf-8" ?>
      <configuration>
          <system.serviceModel>
              <bindings>
                  <netTcpBinding>
                      <binding name="HelloService_TCP" 
                             
                               closeTimeout="00:01:00" openTimeout="00:01:00"
                          receiveTimeout="00:10:00" sendTimeout="00:01:00" transactionFlow="false"
                          transferMode="Buffered" transactionProtocol="OleTransactions"
                          hostNameComparisonMode="StrongWildcard" listenBacklog="10"
                          maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="10"
                          maxReceivedMessageSize="65536">
                          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                              maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                          <reliableSession ordered="true" inactivityTimeout="00:10:00"
                              enabled="false" />
                          <security mode="Transport">
                              <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
                              <message clientCredentialType="Windows" />
                          </security>
                      </binding>
                  </netTcpBinding>
                  <wsDualHttpBinding>
                      <binding name="HelloService_HTTP"
                               clientBaseAddress="http://localhost:8088/HalloServiceClient/"
                               closeTimeout="00:01:00" openTimeout="00:01:00"
                          receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false"
                          transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                          maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                          messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true">
                          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                              maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                          <reliableSession ordered="true" inactivityTimeout="00:10:00" />
                          <security mode="Message">
                              <message clientCredentialType="Windows" negotiateServiceCredential="true"
                                  algorithmSuite="Default" />
                          </security>
                      </binding>
                  </wsDualHttpBinding>
              </bindings>
              <client>
                  <endpoint address="http://ServerIP:9001/" binding="wsDualHttpBinding"
                      bindingConfiguration="HelloService_HTTP" contract="ServiceReference1.IHelloService"
                      name="HelloService_HTTP">
                      <identity>
                          <userPrincipalName value="BURKUTPC\burkut" />
                      </identity>
                  </endpoint>
                  <endpoint address="net.tcp://ServerIP:9002/" binding="netTcpBinding"
                      bindingConfiguration="HelloService_TCP" contract="ServiceReference1.IHelloService"
                      name="HelloService_TCP">
                      <identity>
                          <userPrincipalName value="BURKUTPC\burkut" />
                      </identity>
                  </endpoint>
              </client>
          </system.serviceModel>
      </configuration>

      hast du einen Tipp?

      Gruss

      Burkut

      Comment


      • #4
        Hallo,

        ich kann auch nur das wiedergeben was in der Fehlermeldung steht. Und das ist das Problem:
        Die Verbindung mit dem Remoteserver kann nicht hergestellt werden. Es konnte keine Verbindung mit "http://ServerIP:9001/" hergestellt werden. TCP-Fehlercode 10061: Es konnte keine Verbindung hergestellt werden, da der Zielcomputer die Verbindung verweigerte ServerIP:9001.
        Also ein Verbindungsproblem. Funktioniert ein einfacher Ping zum Server? Kannst du irgenwie prüfen ob der Server auf diesem Port anspricht?

        Dazu in Command Prompt:
        Code:
        c:\> ping ServerIP:9001
        Tut mir leid wenn ich dir keine Lösung bieten kann. Ich müsste schon auf die Rechner zugreifen können um selber zu probieren. Somit bleibt mir nichts übrig als dich so irgendwie zu unterstützen. Bitte um Verständnis. Ich will aber auch dass es (endlich) funktioniert - weil ich davon selber lernen will.

        mfG Gü
        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

        Comment


        • #5
          Originally posted by gfoidl View Post

          Tut mir leid wenn ich dir keine Lösung bieten kann. Ich müsste schon auf die Rechner zugreifen können um selber zu probieren. Somit bleibt mir nichts übrig als dich so irgendwie zu unterstützen. Bitte um Verständnis. Ich will aber auch dass es (endlich) funktioniert - weil ich davon selber lernen will.
          Das ist sehr nett von dir. Weisst du, das Problem zerbricht mir den Kopf. Es sollte ganzes einfaches, lösbares Problem. Aber es klemmt irgendwo. Weiss ich nicht.

          Code:
          c:\> ping ServerIP:9001
          c:\> ping Computername:9001
          Ich habe gerade den Ping test gemacht. Das Ergebnis:
          Ping-Anforderung konnte Host "ServerIP:9001" nicht finden. Überprüfen Sie den Namen, und versuchen Sie es erneut.
          Aber daraus kann ich nicht zusammen folgern,dass ich keine Verbindung zwischen beiden Rechnern haben könnte. Weil ich .net Remoting Test(auch ein Client Server anwendung) ausführe, kriege ich Verbindung in Client-->Server Richtung(also immer noch).

          Noch Weitere Tipps?

          Comment


          • #6
            Hallo,

            Nur so vielleicht eine paar komische Gedanke von mir, vielleicht ja, oder auch nicht, ich habe selbe nicht raus gefunden.....
            1. Soll die .Net Framework 3.0 oder höher Voraussetzung für die Remote Kommunikation sein`?
            2. Wie sollten die BaseAdresse in Server konfig und Client Konfig sein? haben sie bestimmte Zusammenhänge? habe ich vielleicht da was falsch gemacht?

            Ich habe es wie gemacht:

            Base Adresse in ServerKonfig: "Protokoll://ServerIP:Port/ImplementierteServiceInterfaceName.svc"
            ClientBaseAdresse:"Protokoll://ServerIP:Port/bliebigeBrgriff"

            Gruss

            Burkut

            Comment


            • #7
              Ping-Anforderung konnte Host "ServerIP:9001" nicht finden.
              Wenn du mit Ping nicht hinkommst kommst du mit WCF auch nicht hin. Komisch dass es mit Remoting geht. Bist du sicher dass du beim Remoting den selben Port verwendest?

              Soll die .Net Framework 3.0 oder höher Voraussetzung für die Remote Kommunikation sein
              WCF gibts ab .net 3.0. Daher ist das Voraussetzung für WCF.

              Wie sollten die BaseAdresse in Server konfig und Client Konfig sein?
              Die Adresse ist im Netzwerk vorgegeben. Für den Port wählst du einen freien Port. Der ServerHost bietet für jeden Endpunkt einen Port. Auf clientseite muss in der Konfig für jeden Endpunkt der verwendet werden soll auch ein Endpunkt konfiguriert werden. D.h Server kann mehre anbieten aber der Client zB nur einen nutzen. Dabe müssen die Ports übereinstimmen.


              mfG Gü
              "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

              Comment


              • #8
                Originally posted by gfoidl View Post
                Wenn du mit Ping nicht hinkommst kommst du mit WCF auch nicht hin. Komisch dass es mit Remoting geht. Bist du sicher dass du beim Remoting den selben Port verwendest?
                ich bin sicher. Ich würde es so versuchen, dass ich erst VS 2005 plus .net 3.5 bzw. dierekt VS 2008 installiere.

                Die Adresse ist im Netzwerk vorgegeben. Für den Port wählst du einen freien Port. Der ServerHost bietet für jeden Endpunkt einen Port. Auf clientseite muss in der Konfig für jeden Endpunkt der verwendet werden soll auch ein Endpunkt konfiguriert werden. D.h Server kann mehre anbieten aber der Client zB nur einen nutzen. Dabe müssen die Ports übereinstimmen.
                Danke nochmal. Das habe ich verstanden. Ich möchte wissen, ob die Vorgehensweise richtige wäre:
                Base Adresse in ServerKonfig: "Protokoll://ServerIP:Port/ImplementierteServiceInterfaceName.svc"
                ClientBaseAdresse:"Protokoll://ServerIP:Port/bliebigeBrgriff"
                viele Grüsse

                Burkut

                Comment


                • #9
                  Ich möchte wissen, ob die Vorgehensweise richtige wäre:
                  Du kannst auf Clientseite einen Dienstverweis hinzufügen und schauen was VS in der Konfig einträgt und daraus am meisten lernen (so habs ich gemacht )


                  mfG Gü
                  "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                  Comment


                  • #10
                    ja ich habe genau sowie du gesagt hast, gemacht. Ich glaube, die ClientBaseAdresse wird nicht mit generiert. Ich habe immer selber eingetragen... Deswegen habe ich Zweifel drauf.
                    Ich habe auch danach gesucht, leider keine Antwort gefunden...

                    Gruss

                    Burkut

                    Comment


                    • #11
                      Ich glaube, die ClientBaseAdresse wird nicht mit generiert.
                      Die word schon generiert insofern die MEX-Information korrket ist.

                      Mir fällt noch was ein:
                      Probier mal einen Service mit ASP.net erstellen (ASP.net - WCF Service, oder so ähnlich). Da wird die Konfig für dich generiert. Wenn es klappt sich mit dem Client auf dieem Service zu verbinden dann können wird das Problem noch mehr einschränken.


                      mfG Gü
                      "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                      Comment


                      • #12
                        Originally posted by gfoidl View Post

                        Mir fällt noch was ein:
                        Probier mal einen Service mit ASP.net erstellen (ASP.net - WCF Service, oder so ähnlich). Da wird die Konfig für dich generiert. Wenn es klappt sich mit dem Client auf dieem Service zu verbinden dann können wird das Problem noch mehr einschränken.


                        mfG Gü
                        Meinst du, dass ich eine WCF Hosting bzw. Service über IIS erstellen sollte?

                        Gruss

                        Burkut
                        Zuletzt editiert von burkut; 06.09.2009, 10:37.

                        Comment


                        • #13
                          Meinst du, dass ich eine WCF Hosting bzw. Service über IIS erstellen sollte?
                          Genau, denn wenn das geht wissen wir dass der Client funktioniert.


                          mfG Gü
                          "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                          Comment


                          • #14
                            hallo Gü,

                            Endlich eine gute Nachricht, Also das Beispiel http://bloggingabout.net/blogs/denni...e-example.aspx funktioniert. Leider das ist nur eine Simplex Kommunikation. Was gute ist, die Kommunikation ist da. So denke ich mir, dass es einen Fehler bei unserer Konfiguration bei Callbackproject gibt.

                            Ich denke immer noch an eine Authetifizierungsrotine in userem Config. Weisst, du wie man bei WCF die Server Authentifizierung ausschalten kann?

                            Die Fehlermeldung am Anfang (siehe unten ) bei Client sagt mir irgendwie, dass WCF Security blockiert die Anmeldung. So denke ich mir, dass es ein Security Mechanismus ein bzw. ausgeschlatet werden muss. aber Ich weiss nicht, wo so was in WCf gibt. was hältst davon?

                            Inner Eception Message: Der Server hat die Clientanmeldeinformationen zurückgewi
                            esen.
                            Message: Der Server hat die Clientanmeldeinformationen zurückgewiesen.
                            Sorce war: mscorlib
                            Server stack trace:
                            bei System.ServiceModel.Channels.WindowsStreamSecurity UpgradeProvider.Windows
                            StreamSecurityUpgradeInitiator.OnInitiateUpgrade(S tream stream, SecurityMessageP
                            roperty& remoteSecurity)
                            bei System.ServiceModel.Channels.StreamSecurityUpgrade InitiatorBase.InitiateU
                            pgrade(Stream stream)
                            bei System.ServiceModel.Channels.ConnectionUpgradeHelp er.InitiateUpgrade(Stre
                            amUpgradeInitiator upgradeInitiator, IConnection& connection, ClientFramingDecod
                            er decoder, IDefaultCommunicationTimeouts defaultTimeouts, TimeoutHelper& timeou
                            tHelper)
                            bei System.ServiceModel.Channels.ClientFramingDuplexSe ssionChannel.SendPreamb
                            le(IConnection connection, ArraySegment`1 preamble, TimeoutHelper& timeoutHelper
                            )
                            bei System.ServiceModel.Channels.ClientFramingDuplexSe ssionChannel.DuplexConn
                            ectionPoolHelper.AcceptPooledConnection(IConnectio n connection, TimeoutHelper& t
                            imeoutHelper)
                            bei System.ServiceModel.Channels.ConnectionPoolHelper. EstablishConnection(Tim
                            eSpan timeout)
                            bei System.ServiceModel.Channels.ClientFramingDuplexSe ssionChannel.OnOpen(Tim
                            eSpan timeout)
                            Gruss

                            Burkut
                            Zuletzt editiert von burkut; 06.09.2009, 12:54.

                            Comment


                            • #15
                              Hallo,

                              Der Server hat die Clientanmeldeinformationen zurückgewi
                              esen.
                              Könnte sein dass der Client das "auf diesem Computer vom Netzwerk aus zugreifen" auf dem Server nicht hat. Dies kann in der lokalen Gruppenrichtlinie von Windows bzw. dem Active Directory (AD) eingestellt werden.

                              Wenn du AD verwendest müssen beide Computer in der selben Domäne sein. Sind beide nicht in der selben Domäne so muss die Bindung dahingehend angepasst werden dass NTLM2 als Authentifizierungsprotokoll verwendet wird - anstatt Kerberos. NTLM2 prüft Benutzername und Passwort anstatt das Konto das in der Domöne registiert ist.
                              D.h. der Client muss einen Benutzer verwenden der auf dem Server registriert ist.

                              Anonoym könntest du mit "SecurityMode = none" arbeiten. Dann müsste aber die (eventuelle) Verschlüsselung auch entfernt werden.
                              All dies lässt sich jedoch mit Konfig-Editor einstellen.

                              Der Artikel Sicherheit in Windows Communication Foundation bietet Inforamtionen zu Sicherheit mit WCF.


                              mfG Gü
                              "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                              Comment

                              Working...
                              X