Announcement

Collapse
No announcement yet.

WCF: Web Service in zweitem Web Service aufrufen

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

  • WCF: Web Service in zweitem Web Service aufrufen

    Hallo allerseits,

    ich möchte momentan in einem Web Service auf eine Methode aus einem anderen Web Service zugreifen. Allerdings bekomme ich jedes Mal, an der Stelle, an der der eine Web Service eine neue Instanz des anderen Webservice öffnen möchte folgende Fehlermeldung:
    Originally posted by InvalidOperationExcption wunde nicht vom Benutzercode behandelt.
    Es wurde kein standardmäßiges Endpunktelement gefunden, das auf den Vertrag "ServiceReference1.IService1" im ServiceModel-Clientkonfigurationsabschnitt verweist. Dies kann folgende Ursachen haben: Für die Anwendung wurde keine Konfigurationsdatei gefunden, oder im Clientelement wurde kein Endpunktelement gefunden, das diesem Vertrag entsprach.
    Um die Möglichen Probleme zu reduzieren habe ich einen sehr einfachen Versuchsaufbau gemacht, bei dem dasselbe Problem auftritt:

    [highlight=c#]
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.Serialization;
    using System.ServiceModel;

    namespace Service1
    {
    [ServiceContract]
    public interface IService1
    {
    [OperationContract]
    String print();
    }
    }
    [/highlight]
    [highlight=c#]
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace Service1
    {
    public class Service1 : IService1
    {
    #region IService1 Member

    public string print()
    {
    return "Service1";
    }

    #endregion
    }
    }
    [/highlight]
    [highlight=c#]
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.ServiceModel;

    namespace ConsoleApplication1
    {
    class Program
    {
    static void Main(string[] args)
    {
    using (ServiceHost serviceHost1 = new ServiceHost(typeof(Service1.Service1)))
    {
    serviceHost1.Open();

    Console.WriteLine("{0} is read.", "Service1");
    Console.WriteLine("Press the Enter key to terminate Service.");
    Console.ReadLine();
    }
    }
    }
    }
    [/highlight]
    [highlight= XML]
    <-- App.config (Service1Host)-->
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
    <system.serviceModel>
    <services>
    <service name="Service1.Service1"
    behaviorConfiguration="Service1MEXBehavior" >
    <endpoint address=""
    binding="basicHttpBinding"
    contract="Service1.IService1"/>

    <!--Enable the MEX endpoint-->
    <endpoint address="mex"
    binding="mexHttpBinding"
    contract="IMetadataExchange" />

    <!--Need to add this so MEX knows the adress of our service-->
    <host>
    <baseAddresses>
    <add baseAddress="http://localhost:8080/Service1"/>
    </baseAddresses>
    </host>
    </service>
    </services>
    <!--A behavior definition for MEX-->
    <behaviors>
    <serviceBehaviors>
    <behavior name="Service1MEXBehavior">
    <serviceMetadata httpGetEnabled="true"/>
    <serviceDebug includeExceptionDetailInFaults="true"/>
    </behavior>
    </serviceBehaviors>
    </behaviors>
    </system.serviceModel>
    </configuration>
    [/highlight]


    [highlight=c#]
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.Serialization;
    using System.ServiceModel;

    namespace Service2
    {
    [ServiceContract]
    public interface IService2
    {
    [OperationContract]
    String print();
    }
    }
    [/highlight]
    [highlight=c#]
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Service1.ServiceReference1;

    namespace Service2
    {
    public class Service2 : IService2
    {
    #region IService1 Member

    public string print()
    {
    Service1Client client = new Service1Client(); // Fehlermeldung return "Service1: " + client.print();
    }

    #endregion
    }
    }
    [/highlight]
    [highlight=xml]
    <-- app.config (Service2 ref Service1) -->
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
    <system.serviceModel>
    <bindings>
    <basicHttpBinding>
    <binding name="BasicHttpBinding_IService1" closeTimeout="00:01:00"
    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
    useDefaultWebProxy="true">
    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
    <security mode="None">
    <transport clientCredentialType="None" proxyCredentialType="None"
    realm="">
    <extendedProtectionPolicy policyEnforcement="Never" />
    </transport>
    <message clientCredentialType="UserName" algorithmSuite="Default" />
    </security>
    </binding>
    </basicHttpBinding>
    </bindings>
    <client>
    <endpoint address="http://localhost:8080/Service1" binding="basicHttpBinding"
    bindingConfiguration="BasicHttpBinding_IService1" contract="ServiceReference1.IService1"
    name="BasicHttpBinding_IService1" />
    </client>
    </system.serviceModel>
    </configuration>
    [/highlight]
    [highlight=c#]
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.ServiceModel;

    namespace ConsoleApplication1
    {
    class Program
    {
    static void Main(string[] args)
    {
    using (ServiceHost serviceHost1 = new ServiceHost(typeof(Service2.Service2)))
    {
    serviceHost1.Open();

    Console.WriteLine("{0} is read.", "Service2");
    Console.WriteLine("Press the Enter key to terminate Service.");
    Console.ReadLine();
    }
    }
    }
    }
    [/highlight]
    [highlight=xml]
    <--app.config (Service2 Host) -->
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
    <system.serviceModel>
    <services>
    <service name="Service2.Service2"
    behaviorConfiguration="Service2MEXBehavior" >
    <endpoint address=""
    binding="basicHttpBinding"
    contract="Service2.IService2"/>

    <!--Enable the MEX endpoint-->
    <endpoint address="mex"
    binding="mexHttpBinding"
    contract="IMetadataExchange" />

    <!--Need to add this so MEX knows the adress of our service-->
    <host>
    <baseAddresses>
    <add baseAddress="http://localhost:8080/Service2"/>
    </baseAddresses>
    </host>
    </service>
    </services>
    <!--A behavior definition for MEX-->
    <behaviors>
    <serviceBehaviors>
    <behavior name="Service2MEXBehavior">
    <serviceMetadata httpGetEnabled="true"/>
    <serviceDebug includeExceptionDetailInFaults="true"/>
    </behavior>
    </serviceBehaviors>
    </behaviors>
    </system.serviceModel>
    </configuration>
    [/highlight]


    [highlight=c#]
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Service12Client.ServiceReference1;

    namespace Service12Client
    {
    class Program
    {
    static void Main(string[] args)
    {
    Service2Client client = new Service2Client();
    Console.WriteLine(client.print());

    Console.ReadLine();
    }
    }
    }
    [/highlight]
    [highlight=xml]
    <--app.config (Client)-->
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
    <system.serviceModel>
    <bindings>
    <basicHttpBinding>
    <binding name="BasicHttpBinding_IService2" closeTimeout="00:01:00"
    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
    useDefaultWebProxy="true">
    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
    <security mode="None">
    <transport clientCredentialType="None" proxyCredentialType="None"
    realm="">
    <extendedProtectionPolicy policyEnforcement="Never" />
    </transport>
    <message clientCredentialType="UserName" algorithmSuite="Default" />
    </security>
    </binding>
    </basicHttpBinding>
    </bindings>
    <client>
    <endpoint address="http://localhost:8080/Service2" binding="basicHttpBinding"
    bindingConfiguration="BasicHttpBinding_IService2" contract="ServiceReference1.IService2"
    name="BasicHttpBinding_IService2" />
    </client>
    </system.serviceModel>
    </configuration>
    [/highlight]


    Kann mir da jemand weiterhelfen?

    Mit freundlichen Grüßen,
    Athlone

  • #2
    Hallo Athlone,

    das Problem ist die Konfiguration - das geht aus der Fehlermeldung hervor.

    Kannst du dieses einfache Testprojekt als zip anhängen - dann kann ich das prüfen. Ein eigenes Projekt erstellen ist mir zuviel aufwand wenn es so auch geht



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

    Comment


    • #3
      Hey Gü.

      Naja, ich hab bei Webservices inzwischen gelernt, dass man sich nicht immer auf die Fehlermeldung verlassen kann.
      Ist echt nett, dass du dir das anschaust.

      Sind 3 Projekte:
      • Service1: Stellt den 1. Service zur verfügung und hostet ihn
      • Service2: Stellt den 2. Service zur verfügung, referenziert den 1. Service und hostet den 2.
      • Service12Client: referenziert den 2. Service


      Falls irgendwelche Fragen auftauchen, einfach noch mal melden.

      Danke schon Mal,
      Athlone
      Attached Files

      Comment


      • #4
        Hallo nochmal,

        nachdem mein Thread verschoben wurde hab ich mal hier im .NET Remoting-Forum n bisschen gestöbert und meiner Meinung nach die Lösung des Problems gefunden:
        http://entwickler-forum.de/showpost....02&postcount=2

        Ich muss lediglich die Informationen, die in der app.config für die Referenz von Service1 auf Service2 in der app.config der Host-Anwendung ergänzen.

        Im kleinen Projekt funktioniert das Ganze schon mal, jetzt probier ichs im großen.

        Gruß,
        Athlone

        Comment


        • #5
          Hallo Athlone,

          zu allererst der Hinweis dass es Namenskonventionen gibt. Daher sollen Methodennamen in PascalCaseSchreibweise geschrieben werden -> print wird somit zu Print.
          Das hat zwar mit der Funktion des Programmes nichts zu tun gehört aber zum Guten Stil.

          Zum Problem:
          In der Projektmappe "Service2" wird im Projekt (DLL) "Service2" der 1. Dienst eingebunden und dadurch wird eine app.config erstellt. Die Service2.dll wird im Host (Exe) verwendet und in .net ist es so dass eine Exe* nur 1 Anwendungskonfigurationsdatei haben kann und zwar jene mit Anwendungsname.exe.config. Dies ist auch hier der Fall. Die für die 1. Dienst notwendigen Informationen stehen jedoch in einer anderen Konfigurationsdatei - nämlich jener der DLL und diese ist bei der Ausführung nicht vorhanden.

          * exakter eine Anwendungsdomäne und sofern nicht anders angegeben beim AppDomainSetup

          Lösung:
          Kopiere den Inhalt der Konfigurationsdatei des DLL-Projekts in die Anwendungskonfigurationsdatei (daher auch der Name) und somit sind die Infos des 1. Dienstes bekannt und es funktioniert wie gewünscht.

          Die Anwendungskonfig des 2. Hosts sieht dann so aus (hab den Dienstverwei in VS erneut hinzugefügt, daher leichte Abweichung möglich).
          [highlight=xml]
          <?xml version="1.0" encoding="utf-8" ?>
          <configuration>
          <system.serviceModel>
          <services>
          <service name="Service2.Service2"
          behaviorConfiguration="Service2MEXBehavior" >
          <endpoint address=""
          binding="basicHttpBinding"
          contract="Service2.IService2"/>

          <!--Enable the MEX endpoint-->
          <endpoint address="mex"
          binding="mexHttpBinding"
          contract="IMetadataExchange" />

          <!--Need to add this so MEX knows the adress of our service-->
          <host>
          <baseAddresses>
          <add baseAddress="http://localhost:8080/Service2"/>
          </baseAddresses>
          </host>
          </service>
          </services>
          <!--A behavior definition for MEX-->
          <behaviors>
          <serviceBehaviors>
          <behavior name="Service2MEXBehavior">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
          </behavior>
          </serviceBehaviors>
          </behaviors>
          <bindings>
          <basicHttpBinding>
          <binding name="BasicHttpBinding_IService1" closeTimeout="00:01:00"
          openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
          allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
          maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
          messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
          useDefaultWebProxy="true">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
          maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <security mode="None">
          <transport clientCredentialType="None" proxyCredentialType="None"
          realm="" />
          <message clientCredentialType="UserName" algorithmSuite="Default" />
          </security>
          </binding>
          </basicHttpBinding>
          </bindings>
          <client>
          <endpoint address="http://localhost:8080/Service1" binding="basicHttpBinding"
          bindingConfiguration="BasicHttpBinding_IService1" contract="ServiceReference1.IService1"
          name="BasicHttpBinding_IService1" />
          </client>
          </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


          • #6
            Hallo Athlone,

            Ich muss lediglich die Informationen, die in der app.config für die Referenz von Service1 auf Service2 in der app.config der Host-Anwendung ergänzen.
            Das ist die Kurzfassung meiner obigen Antwort


            mfG Gü


            PS: Gut dass ich den Beitrag verschoben habe
            "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

            Comment

            Working...
            X