【问题标题】:Why is my WCF ServiceAuthorizationManager being called twice on each request?为什么每次请求都会调用我的 WCF ServiceAuthorizationManager 两次?
【发布时间】:2014-07-25 18:34:14
【问题描述】:

我已经在服务器 2k8 上的 IIS 7.5 下运行的 WCF 服务中实现了 ServiceAuthorizationManager。对于每个传入请求,都会调用 CheckAccessCore 函数两次。第一次调用 CheckAccessCore 时,Authorization 标头就在那里,并且用户已通过身份验证。第二次调用 CheckAccessCore 时,Authorization 标头为空,身份验证显然失败。为什么会出现第二部分?

交互:

<OperationContract()>
<WebInvoke(UriTemplate:="", Method:="POST", BodyStyle:=WebMessageBodyStyle.Bare)>
Function ProcessMessage(ByVal value As Stream) As Stream

web.config:

<system.serviceModel>
<bindings>
  <basicHttpBinding>
    <binding name="BasicHttpBinding_IMyDataService" />
  </basicHttpBinding>
  <webHttpBinding>
    <binding name="RestSSL"> 
      <security mode="Transport">

      </security>
    </binding>
  </webHttpBinding>
</bindings>
<client>
  <endpoint address="http://localhost/OtherSvcLib/Service1/"
    binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IMyDataService"
    contract="DataService.IMyDataService" name="BasicHttpBinding_IMyDataService" />
</client>
<services>
  <service name="MyServiceLib.MyHubSvcLib" behaviorConfiguration="gogogo">
    <endpoint address="" 
              binding="webHttpBinding" 
              bindingConfiguration="RestSSL"
              behaviorConfiguration="RestSvcBehavior" 
              contract="MyServiceLib.IMyService"> 
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="https://mydomain.com/MyServiceLib/MyHub.svc" />
      </baseAddresses>
    </host>
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="gogogo">
      <serviceAuthorization serviceAuthorizationManagerType="MyServiceLib.clsCustomAuthManager, MyServiceLib">

      </serviceAuthorization>

      <serviceMetadata httpsGetEnabled="True"/>

      <serviceDebug includeExceptionDetailInFaults="False"/>
    </behavior>
  </serviceBehaviors>
  <endpointBehaviors>
    <behavior name="RestSvcBehavior">
      <webHttp helpEnabled="true"/>
    </behavior>
  </endpointBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />

【问题讨论】:

  • 你是如何发现它被两次调用的?
  • @usr 每当调用该方法时,我都会开始将标头内容写入文本文件。
  • 您确定您的服务只被调用一次吗?
  • 它是从我扔在一起的一个小的 winform 测试客户端用 HttpWebRequest 调用的。很确定该方法只触发一次。

标签: .net wcf authentication iis


【解决方案1】:

我解决了这个问题。看起来 IIS 可能不喜欢我界面中的模棱两可的(?) uriTemplate 并且正在转发或重定向请求,或者它可能是其他东西,我不会再花时间调查它。我只是将“/”添加到 uriTemplate 和客户端中的 URL。

不起作用:(向 mydomain.com/service.svc 请求)

<OperationContract()>
<WebInvoke(UriTemplate:="", Method:="POST", BodyStyle:=WebMessageBodyStyle.Bare)>
Function ProcessMessage(ByVal value As Stream) As Stream

有效:(对 mydomain.com/service.svc/ 的请求)注意 UriTemplate 中的“/”:="/"

<OperationContract()>
<WebInvoke(UriTemplate:="/", Method:="POST", BodyStyle:=WebMessageBodyStyle.Bare)>
Function ProcessMessage(ByVal value As Stream) As Stream

【讨论】:

    猜你喜欢
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    相关资源
    最近更新 更多