2012-04-13 17 views
0

Ich habe das grundlegendste Beispiel für die Einrichtung eines gehosteten Endpunkts genommen ... http://msdn.microsoft.com/en-us/library/ms731758.aspx ... und ich möchte, dass mein Dienst so konfiguriert wird, wie er es innerhalb von sagt IIS ... mit der Konfigurationsdatei für meine Anwendung.Konfigurieren von selbst gehosteten WCF-Service-Endpunkten

Das ist scheinbar nicht der Standard in diesem Szenario.

Irgendwelche Ideen?

EDIT:

gemäß den obigen Link i etwas wie dieses ...

// Create the ServiceHost. 
using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress)) 
{ 
    // Enable metadata publishing. 
    ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); 
    smb.HttpGetEnabled = true; 
    smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15; 
    host.Description.Behaviors.Add(smb); 

    // Open the ServiceHost to start listening for messages. Since 
    // no endpoints are explicitly configured, the runtime will create 
    // one endpoint per base address for each service contract implemented 
    // by the service. 
    host.Open(); 

    Console.WriteLine("The service is ready at {0}", baseAddress); 
    Console.WriteLine("Press <Enter> to stop the service."); 
    Console.ReadLine(); 

    // Close the ServiceHost. 
    host.Close(); 
} 

jetzt will ich das "baseaddress" haben und die smb Objekt Informationen über Config zugewiesen. zum Beispiel als

<system.ServiceModel> 

    <services> 
    <!—- Define the service endpoints. This section is optional in the new 
    default configuration model in .NET Framework 4. --> 
     <service> 
     <endpoint/> 
     </service> 
    </services> 

    <bindings> 
    <!-- Specify one or more of the system-provided binding elements, 
    for example, <basicHttpBinding> --> 
    <!-- Alternatively, <customBinding> elements. --> 
     <binding> 
     <!-- For example, a <BasicHttpBinding> element. --> 
     </binding> 
    </bindings> 

    <behaviors> 
    <!-- One or more of the system-provided or custom behavior elements. --> 
     <behavior> 
     <!-- For example, a <throttling> element. --> 
     </behavior> 
    </behaviors> 

</system.ServiceModel> 

mein Problem ist bei http://msdn.microsoft.com/en-us/library/ms733932.aspx ... definiert, dass, wie erwartet, wenn ich der Endpunkt ist nicht dort an die konfigurierten Basisadresse mit meinem Browser zu sehen.

Ich bekomme keine Fehler und es verhält sich wie ein aktiver Endpunkt ... aber wo ist es?

EDIT 2: Zusätzliche Informationen: Der Code ich verwende wie oben, meine Config-Datei wie folgt aussieht ...

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> 
    <section name="TaskServiceConfiguration" type="emedia.nemo.Configuration.XmlSerializerSectionHandler, emedia.nemo"/> 
    </configSections> 

    <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> 
    </startup> 

    <TaskServiceConfiguration type="Emedia.TaskScheduler.Service.TaskServiceConfiguration, Emedia.TaskScheduler.Service, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"> 
    <PollInterval>5</PollInterval> 
    <ServiceURL>http://localhost:10000/TaskSchedulerService.svc</ServiceURL> 
    </TaskServiceConfiguration> 

    <log4net> 
    <appender name="FileAppender" type="log4net.Appender.FileAppender"> 
     <file value="log-file.txt"/> 
     <appendToFile value="true"/> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date %-5level %logger - %message%newline"/> 
     </layout> 
    </appender> 
    <appender name="DebugFileAppender" type="log4net.Appender.FileAppender"> 
     <file value="log-file.txt"/> 
     <appendToFile value="true"/> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date %-5level %logger - %message%newline"/> 
     </layout> 
    </appender> 
    <appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender"> 
     <mapping> 
     <level value="ERROR"/> 
     <foreColor value="Red"/> 
     </mapping> 
     <mapping> 
     <level value="DEBUG"/> 
     <foreColor value="Yellow"/> 
     </mapping> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%-5level- %message%newline"/> 
     </layout> 
    </appender> 
    <root> 
     <level value="DEBUG"/> 
     <appender-ref ref="FileAppender"/> 
     <appender-ref ref="ColoredConsoleAppender"/> 
    </root> 
    </log4net> 

    <system.diagnostics> 
    <sources> 
     <source name="System.ServiceModel.MessageLogging" switchValue="Warning, ActivityTracing"> 
     <listeners> 
      <add name="Default" type="System.Diagnostics.DefaultTraceListener" /> 
      <add name="ServiceModelMessageLoggingListener" /> 
     </listeners> 
     </source> 
     <source name="System.ServiceModel" propagateActivity="true" switchValue="Warning, ActivityTracing"> 
     <listeners> 
      <add name="Default" type="System.Diagnostics.DefaultTraceListener" /> 
      <add name="ServiceModelTraceListener" /> 
     </listeners> 
     </source> 
    </sources> 
    <sharedListeners> 
     <add name="ServiceModelMessageLoggingListener" 
      initializeData="Web_messages.svclog" 
      traceOutputOptions="Timestamp" 
      type="System.Diagnostics.XmlWriterTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
      /> 
     <add name="ServiceModelTraceListener" 
      initializeData="Web_tracelog.svclog" 
      traceOutputOptions="Timestamp" 
      type="System.Diagnostics.XmlWriterTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
      /> 
    </sharedListeners> 
    </system.diagnostics> 

    <system.serviceModel> 
    <!-- Server side stuff --> 
    <services> 
     <service behaviorConfiguration="wsHttpBehaviour" 
       name="Emedia.Messaging.Services.TaskSchedulerService"> 
     <endpoint address="http://localhost:10000/TaskSchedulerService.svc" 
        binding="wsHttpBinding" 
        bindingConfiguration="wsHttpBinding" 
        contract="Emedia.Messaging.Services.ITaskServiceContract" 
        /> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="wsHttpBehaviour"> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
     </behavior> 
     <behavior name=""> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true"/> 

    <!-- Client side stuff --> 
    <bindings> 
     <wsHttpBinding> 
     <binding name="wsHttpBinding" 
       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" 
       allowCookies="false"> 
      <readerQuotas maxDepth="32" 
         maxStringContentLength="8192" 
         maxArrayLength="16384" 
         maxBytesPerRead="4096" 
         maxNameTableCharCount="16384" 
         /> 
      <reliableSession ordered="true" 
          inactivityTimeout="00:10:00" 
          enabled="false" 
          /> 
      <security mode="Message"> 
      <transport clientCredentialType="Windows" 
         proxyCredentialType="None" 
         realm="" 
         /> 
      <message clientCredentialType="Windows" 
        negotiateServiceCredential="true" 
        algorithmSuite="Default" 
        /> 
      </security> 
     </binding> 
     </wsHttpBinding> 
    </bindings> 

    <client> 
     <endpoint address="http://localhost:10000/TaskSchedulerService.svc" 
       binding="wsHttpBinding" 
       bindingConfiguration="wsHttpBinding" 
       contract="WCFTask.ITaskServiceContract" 
       name="wsHttpBinding"> 
     </endpoint> 
    </client> 
    </system.serviceModel> 
</configuration> 

EDIT: einige weitere Einzelheiten über Umfang:

die Der WCF-Endpunkt ist in einem Webprojekt definiert. Das Webprojekt wird von einem Windows-Dienst referenziert, der eine Instanz davon hostet. Ich habe dann eine Konsole App, die auf eine Instanz des Windows-Dienstes verweist und sie erstellt, um sie zu testen.

Meine Frage besteht darin, dass diese Konsolenanwendung den Windows-Dienst und damit den WCF-Endpunkt startet, damit er dann auf dem Endpunkt Aufrufe durchführen kann, um einige End-to-End-Tests meiner Lösung durchzuführen.

+1

Was ** genau ** ist deine Frage ?? Können Sie uns einen Code und/oder eine Konfiguration zeigen, die Sie haben und beschreiben, welche Probleme/Probleme Sie haben? –

+0

ok ... 1 min il fügen Sie einige Details hinzu – War

+0

Das sollte viel besser sein – War

Antwort

2

Überarbeitete Antwort Based On Zusätzliche Informationen

Ok, wenn ich Sie richtig verstehe, haben Sie einen WCF-Web-Anwendung erstellt, und einen separaten Windows-Dienst, der eine Instanz des WCF-Dienst erstellt. Jetzt versuchen Sie, eine Konsolenanwendung zum Testen Ihrer Lösung zu erstellen.

Ich denke, Sie machen Dinge komplexer als sie sein müssen. Der Windows-Dienst sollte entweder ein Client sein, der den WCF-Dienst aufruft, oder er sollte den WCF-Dienst selbst hosten.

In beiden Fällen, wenn Sie eine Konsole App für End-to-End-Tests Ihrer Lösung schreiben, scheint es mir, dass die Konsole App ist Client - die wie gesagt nichts zu tun mit ServiceHost oder Hosting des Dienstes.

Starten Sie den Dienst einfach in Ihrer Konsolen-App (oder starten Sie ihn separat und lassen Sie ihn bereits laufen) und führen Sie dann Aufrufe für den Windows-Dienst auf die gleiche Weise wie für jeden anderen Client aus.

Wenn mir noch etwas fehlt, lass es mich wissen und ich werde es noch einmal versuchen.Ich bin dabei, mich abzumelden, also fühlen Sie sich frei, mir eine E-Mail zu schicken (meine Adresse ist in meinem Profil) und ich werde es morgen anschauen.

+0

das ist mein Problem ... Ich habe die app.config Datei hinzugefügt und den Dienst konfiguriert, aber es ist wie es ist die Config-Datei zu ignorieren und einfach so, als ob ich das tun, ohne dass es da sein – War

+0

Ah..didnot nicht fangen Teil. Wird der Dienst ausgeführt, wenn Sie im Browser darauf zugreifen? – Tim

+0

wenn ich ServiceHost host = neue ServiceHost (typeof (HelloWorldService)) dann kann der Browser es nicht finden, aber wenn ich ServiceHost Host = neue ServiceHost (typeof (HelloWorldService), "http: // localhost: 10000/TaskSchedulerService.svc")) dann kann es, aber es informiert mich dann, dass die Veröffentlichung von Metadaten nicht aktiviert ist – War

Verwandte Themen