【问题标题】:Why WCF custom ServiceHostFactory getting called every time?为什么每次都调用 WCF 自定义 ServiceHostFactory?
【发布时间】:2015-04-23 01:05:41
【问题描述】:

我有一个 WCF 服务(托管在 IIS 7.5 中),它使用以下方式激活了 SVC 文件较少

<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. 为什么每次调用都会创建我的服务实例?

【问题讨论】:

  • 再次尝试检查您的配置。我试图通过创建示例应用程序来模拟它,但它工作正常,只创建了一个自定义主机工厂和服务的实例。
  • @Lukas:我应该在配置中检查什么?
  • 您能告诉我您的自定义主机工厂如何创建该服务的实例吗?

标签: wcf wif


【解决方案1】:

正如我所说,我创建了一个简单的应用程序并且它工作正常。所以试着比较一下:

服务主机

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>

我启动了 Web 应用程序,多次调用 SayHello 函数,如下所示,它的行为正确:

【讨论】:

  • 您的代码很完美,可以正常工作。就我而言,我没有使用正常的服务合同。它是 WSTrustServiceContract,它也在配置文件中进行了配置。
猜你喜欢
  • 2013-08-05
  • 1970-01-01
  • 2018-06-13
  • 2019-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-10
相关资源
最近更新 更多