ASP.net实例化模式有什么区别?

时间:2017-02-17 22:09:59

标签: c# asp.net

原始问题变得多余,因为它基于错误的假设,因此编辑它以提供有关Sessions, Instancing and Concurrency的一些信息以及下面接受的答案。

1 个答案:

答案 0 :(得分:1)

各种托管类型通常是相同的:IIS,Windows服务,WCF。

  

ASP.net实现如何在内部工作,使用什么机制隔离静态变量而不为每个服务调用创建新的AppDomain。

有一篇很好的Code Project文章解释了高级别的差异,如果你想看看底层,你应该使用像ILSpy或Reflector这样的Decompiler来查看实现细节。 实现的差异将是每个请求或每个会话对象单例,实例化或池化的方式

以下是代码项目文章的摘录:Three ways to do WCF instance management

enter image description here

enter image description here

enter image description here

要设置PerCall InstanceContext,请使用ServiceBehaviour属性:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]

以下是服务行为属性的源代码:

https://referencesource.microsoft.com/#System.ServiceModel/System/ServiceModel/ServiceBehaviorAttribute.cs,b743193260862969,references

特别是在建立instanceModeContext Provider的地方:

dispatch.InstanceContextProvider = InstanceContextProviderBase.GetProviderForMode(this.instanceMode, dispatch);

if ((this.instanceMode == InstanceContextMode.Single) &&
    (dispatch.SingletonInstanceContext == null))
{
    if (singleton == null)
    {
        if (this.wellKnownSingleton != null)
        {
            singleton = new InstanceContext(serviceHostBase, this.wellKnownSingleton, true, false);
        }
        else if (this.hiddenSingleton != null)
        {
            singleton = new InstanceContext(serviceHostBase, this.hiddenSingleton, false, false);
        }
        else
        {
            singleton = new InstanceContext(serviceHostBase, false);
        }

        singleton.AutoClose = false;
    }
    dispatch.SingletonInstanceContext = singleton;
}

所以你可以看到区别在于wellKnownSingleton,hiddenSingleton或者两者之间的切换,这是对象单独,实例化或合并的实现方式。

您可以浏览代码库并查看channelDispatcher代码,以查看有关实现细节的更多信息。