2015-04-23 7 views
0

У меня есть службы WCF (размещенная в IIS 7.5), который имеет SVC файл меньше активации с помощью следующегоПочему WCF пользовательский ServiceHostFactory вызывается каждый раз?

<serviceHostingEnvironment> 
    <serviceActivations> 
     <add factory="String" 
      service="String"/> 
    </serviceActivations> 
</serviceHostingEnvironment> 

Я использую пользовательский хост завод не по умолчанию один.

И сервис WSTrustServiceContract. Теперь, если вы видите объявление этого класса

[ServiceBehaviorAttribute(Name = "SecurityTokenService", Namespace = "http://schemas.microsoft.com/ws/2008/06/identity/securitytokenservice", 
    InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)] 
[AspNetCompatibilityRequirementsAttribute(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public class WSTrustServiceContract : IWSTrustFeb2005SyncContract, 
    IWSTrust13SyncContract, IWSTrustFeb2005AsyncContract, IWSTrust13AsyncContract, IWsdlExportExtension, IContractBehavior 

Таким образом, мы можем сделать вывод, что

  1. Обычай хозяин завода будет называться, чтобы создать экземпляр службы.
  2. После того, как экземпляр службы будет создан, он будет для всех запросов (InstanceContextMode.Single)

Моих вопросов

  1. Почему экземпляр пользовательского хозяина фабрики становится создан за вызов (У меня есть точка останова в конструкторе этой фабрики. Я отлаживаю, присоединяясь к экземпляру w3wc)?
  2. Почему экземпляр моего сервиса создается за звонок?
+0

Попробуйте снова проверить конфигурацию. Я попытался имитировать это, создав образец приложения, но он работал правильно, был создан только один экземпляр фабрики и службы пользовательских хостов. –

+0

@ Lukas: Что я должен проверить в конфигурации? – ViBi

+0

Можете ли вы показать мне, как ваш пользовательский завод-изготовитель создает экземпляр этой службы? –

ответ

0

Как я уже сказал, я создал простое приложение, и он работал правильно. Поэтому постарайтесь, чтобы сравнить, что:

ServiceHost

Public Class MyServiceHost 
    Inherits ServiceHost 

    Public Sub New(serviceType As Type, baseAddresses As Uri()) 
     MyBase.New(serviceType, baseAddresses) 
    End Sub 

End Class 

Public Class MyServiceHostFactory 
    Inherits ServiceHostFactory 

    Public Sub New() 
     Trace.TraceInformation("MyServiceHost instance created.") 
    End Sub 

    Protected Overrides Function CreateServiceHost(serviceType As Type, baseAddresses As Uri()) As ServiceHost 
     Return New MyServiceHost(serviceType, baseAddresses) 
    End Function 

End Class 

Сервис

<ServiceContract> 
Public Interface IService 

    <OperationContract()> 
    Function SayHello(name As String) As String 

End Interface 

<ServiceBehavior(InstanceContextMode:=InstanceContextMode.Single, ConcurrencyMode:=ConcurrencyMode.Multiple)> 
<AspNetCompatibilityRequirements(RequirementsMode:=AspNetCompatibilityRequirementsMode.Allowed)> 
Public Class Service 
    Implements IService 

    Public Sub New() 
     Trace.TraceInformation("Service instance created.") 
    End Sub 

    Public Function SayHello(name As String) As String Implements IService.SayHello 
     Trace.TraceInformation("Calling Service.SayHello({0}).", name) 
     Return "Hello " & name 
    End Function 

End Class 

Public Class Global_asax 
    Inherits HttpApplication 

    Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs) 
     Trace.TraceInformation("Application started") 
    End Sub 

End Class 

Web.config

<system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior> 
       <serviceMetadata httpGetEnabled="true" /> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"> 
     <serviceActivations> 
      <add factory="FileLessActivationWithCustomServiceHost.MyServiceHostFactory" 
       service="FileLessActivationWithCustomServiceHost.Service" 
       relativeAddress="Service.svc"/> 
     </serviceActivations> 
    </serviceHostingEnvironment> 
</system.serviceModel> 

<system.diagnostics> 
    <trace autoflush="true" indentsize="4"> 
     <listeners> 
      <remove name="Default" /> 
      <add name="Default" 
       type="System.Diagnostics.XmlWriterTraceListener" 
       initializeData="log.svclog" /> 
     </listeners> 
    </trace> 
</system.diagnostics> 

Я начал веб-приложение, сделал несколько звонков SayHello и, как вы можете видеть ниже, он ведет себя правильно: enter image description here

+0

Ваш код прекрасен, и он будет работать нормально. В моем случае я не использую обычный контракт на обслуживание. Это WSTrustServiceContract, и он также настроен в файле конфигурации. – ViBi

 Смежные вопросы

  • Нет связанных вопросов^_^