(注意:我最终自己解决了这个问题,模仿不是主要问题;但是,如果有人知道冒充的原因,请告诉我。)
我们有一个从Silverlight应用程序调用的WCF服务(它们由同一个Web应用程序托管)。与操作本身花费的时间相比,调用服务的速度非常慢。 WCF跟踪日志使模拟花费的时间超过两秒(参见第五行):
[15:32:3.193] From: Processing message 1.
[15:32:3.193] Activity boundary.
[15:32:3.193] Received a message over a channel.
[15:32:3.194] ServiceChannel information.
[15:32:5.539] Security Impersonation succeeded at the server.
[15:32:5.540] To: Execute 'MyNamespace.GetFloorplan'.
[15:32:5.540] Activity boundary.
[15:32:6.302] From: Execute 'MyNamespace.GetFloorplan'.
[15:32:6.302] Activity boundary.
[15:32:6.305] Sent a message over a channel.
[15:32:6.306] Activity boundary.
这让我感到困惑,因为我认为模仿是你需要在配置中显式启用(或从代码触发)。我刚刚作为顾问参与了这个项目,所以我还没有对整个源代码进行全面概述,但源代码中的任何地方都没有“模拟”或“模仿”的文本。更令人困惑的是,服务内部的System.Threading.Thread.CurrentPrincipal.Identity
会返回一个没有名称的未经身份验证的身份,而System.Security.Principal.WindowsIdentity.GetCurrent().Name
会返回IIS APPPOOL\MyCustomAppPool
,因此模仿似乎并没有完成任何任何事情。
我们使用表单身份验证和ASP.NET兼容模式。当我禁用后者时(我不确定我可以永久执行,因为可能存在依赖于它的功能,我还不知道),Security Impersonation succeeded at the server
从日志中消失,但时差Received a message over a channel.
和To: Execute 'MyNamespace.GetFloorplan'.
之间的差距仍然接近两秒。在操作中添加[OperationBehavior(Impersonation = ImpersonationOption.NotAllowed)]
无济于事。
有谁知道这里发生了什么? (我的目标是摆脱假冒或其他任何占用这两秒钟的东西。)
我们在服务类上有以下属性(我知道它们理想情况下应该在接口上,但我还没有发现它们是否有理由首先放在服务上):
[ServiceContract(Namespace = "")]
[SilverlightFaultBehavior]
[AspNetCompatibilityRequirements(RequirementsMode =
AspNetCompatibilityRequirementsMode.Allowed)]
以下是我们的服务配置:
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"
multipleSiteBindingsEnabled="true" />
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<customBinding>
<binding name="SilverlightServiceBinding">
<binaryMessageEncoding />
<httpTransport />
</binding>
</customBinding>
</bindings>
<services>
<service name="MyNamespace.FloorplanService">
<endpoint address="" binding="customBinding"
bindingConfiguration="SilverlightServiceBinding"
contract="MyNamespace.FloorplanService" />
<endpoint address="mex" binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
</services>
</system.serviceModel>
我们的客户配置:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_FloorplanService"
maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
<security mode="None" />
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="../Floorplan/FloorplanService.svc"
binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_FloorplanService"
contract="FloorplanServiceProxy.FloorplanService"
name="BasicHttpBinding_FloorplanService" />
</client>
</system.serviceModel>
答案 0 :(得分:2)
事实证明,模拟消息是一个红色的鲱鱼(我应该理解它,因为它在禁用ASP.NET兼容模式时消失了,而请求仍然花费了相当多的时间)。但是,WCF跟踪日志确实指出了我正确的方向:在实际调用操作之前,WCF中显然发生了非常耗时的事情。最终,我们发现Web应用程序包含一个用户身份验证/授权类,由于配置不正确的依赖注入容器,每个请求多次调用,导致许多不必要的数据库请求。
经验教训(如果其他人遇到同样的问题):根据您的配置,WCF可能会在您的代码执行之前调用身份验证和授权机制,这些可能会花费不可忽略的时间。
答案 1 :(得分:0)
可能是您网站的IIS自动提醒。
如果您启用了多种身份验证类型,并且它首先尝试其他一种身份验证类型。