简体   繁体   English

配置自托管的wcf服务端点

[英]Configuring self hosted wcf service endpoints

I've taken the most basic example of setting up a hosted endpoint ... http://msdn.microsoft.com/en-us/library/ms731758.aspx ... and from this i want to have my service be configured in the way that it does within say IIS ... using the config file for my application. 我已经采用了设置托管端点的最基本示例... http://msdn.microsoft.com/en-us/library/ms731758.aspx ...从此我想要配置我的服务就像它在IIS中那样...使用我的应用程序的配置文件。

That seemingly is not the default in this scenario. 在这种情况下,这似乎不是默认值。

Any ideas? 有任何想法吗?

EDIT: 编辑:

as per the link above i have something like this ... 根据上面的链接我有这样的东西......

// 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();
}

now i want to have the "baseAddress" and the smb object info assigned using config. 现在我想要使用config分配“baseAddress”和smb对象信息。 for example as defined at http://msdn.microsoft.com/en-us/library/ms733932.aspx ... 例如,在http://msdn.microsoft.com/en-us/library/ms733932.aspx中定义...

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

my problem is that if i browse to the configured base address using my browser the endpoint isn't there as expected. 我的问题是,如果我使用我的浏览器浏览到配置的基地址,则端点不会按预期存在。

I get no errors and its acting like theres an active endpoint up ... but where is it? 我没有错误,它的表现就像是一个活跃的终点......但它在哪里?

EDIT 2: Additional info: The code i'm using is as above, my config file looks like this ... 编辑2:附加信息:我正在使用的代码如上所述,我的配置文件看起来像这样......

<?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: some more detail on scope: 编辑:关于范围的更多细节:

the wcf endpoint is defined in a web project. wcf端点在Web项目中定义。 the web project is referrenced by a windows service which hosts an instance of it. Web项目由托管其实例的Windows服务引用。 i then have a console app that refers to and creates an instance of the windows service in order to test it. 然后我有一个控制台应用程序引用并创建一个Windows服务的实例,以测试它。

My question is about getting that console app to fire up the windows service and that in turn the WCF endpoint so that it can then make calls on the endpoint in order to perform some end to end testing of my solution. 我的问题是让控制台应用程序启动Windows服务,然后启动WCF端点,以便它可以在端点上进行调用,以便执行我的解决方案的端到端测试。

Revised Answer Based On Additional Info 基于附加信息修改的答案

Ok, if I understand you correctly, you've created a WCF web application, and a separate Windows Service that creates an instance of that WCF service. 好的,如果我理解正确的话,你已经创建了一个WCF Web应用程序,以及一个单独的Windows服务,它创建了该WCF服务的实例。 Now you're trying to create a console app to test your solution. 现在,您正在尝试创建一个控制台应用程序来测试您的解决方案。

I think you're making things more complex than they need to be. 我认为你制造的东西比他们需要的东西更复杂。 The Windows Service should either be a client that calls the WCF service, or it should host the WCF service itself. Windows服务应该是调用WCF服务的客户端,或者它应该托管WCF服务本身。

In either event, if you're writing a console app to do end-to-end testing of your solution, it certainly seems to me that the console app is the client - which as I've said has nothing to do with ServiceHost or hosting the service. 在任何一种情况下,如果您正在编写一个控制台应用程序来对您的解决方案进行端到端测试,那么在我看来,控制台应用程序就是客户端 - 正如我所说,它与ServiceHost无关或托管服务。

Simply start the service from within your console app (or start it separately and have it already running), and then execute calls against the Windows Service in the same way any other client would. 只需从控制台应用程序中启动服务(或单独启动它并让它已经运行),然后以与任何其他客户端相同的方式对Windows服务执行调用。

If I'm still missing something, let me know and I'll try again. 如果我还缺少某些东西,请告诉我,我会再试一次。 I'm about to sign off, so feel free to e-mail me (my address is in my profile) and I'll look at it tomorrow. 我即将签字,所以请随时给我发电子邮件(我的地址在我的个人资料中),明天我会看。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM