WCF,2016 年 Windows 错误 405,但 2008 年没有

WCF, error 405 on Windows 2016 but not on 2008

WCF 服务 运行 ASP.NET 4.52,Silverlight 客户端。该应用曾经在 Windows 2008 R2 上运行。现在我已经在 Windows 2016 服务器上设置了它,并且第一个服务调用出错并显示错误 405 - 方法不允许。这里的方法是POST。错误描述如下:

405 - HTTP verb used to access this page is not allowed.

在基于 Windows 2008 的实例上,它也是 POST,但后端对此没有问题。该服务使用带有 Windows 身份验证的 HTTPS。

相关的 Web.config 位是:

    <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="winAuthBasicHttpBinding" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647">
          <readerQuotas maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxDepth="2147483647" maxNameTableCharCount="2147483647" maxStringContentLength="2147483647"/>
          <security mode="Transport">
            <transport clientCredentialType="Ntlm"/>
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="Foo.Web.Services.FooBehavior">
          <serviceMetadata httpsGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service behaviorConfiguration="Foo.Web.Services.FooBehavior" name="Foo.Web.Services.FooService">
        <endpoint address="" binding="basicHttpBinding" bindingConfiguration="winAuthBasicHttpBinding" contract="Foo.Web.Services.IFooService">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
      </service>
    </services>
    </system.serviceModel>

错误方法除[OperationContract]外没有其他注释。界面只有[ServiceContract]。服务 class 有:

    [WcfErrorBehavior]
    [WcfSilverlightFaultBehavior]    
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

该方法没有参数可能是相关的;我相信较新版本的 WCF 对这些使用 GET。该应用程序很旧。

该错误通过通用 HTTP 客户端重现,并非特定于 Silverlight 前端。

看起来 .NET 版本之间的机器级 WCF 配置有所不同。不太可能,Windows 组件可能在 Windows 2016 盒子上丢失。

编辑:启用请求跟踪,得到一些东西。有一条通知 EXECUTE_REQUEST_HANDLER 发送到 StaticFileModule。 WCF 服务绝对不是静态文件。

在服务器管理器、角色和功能下,WCF 类别中缺少 "HTTP Activation"。我的第二个预感是对的。也就是说,这个错误有点误导,所以为了后代的缘故,我将把这个问题留在这里。

无论如何,我想回复这个话题。它可能对遇到类似问题的人有用。
@Seva Alekseyev,正如您提到的,为了在 IIS 中托管由 Webhttpbinding 创建的 WCF 服务,以及一些其他协议,例如 Nettcpbinding,我们应该启用某些类型的 Windows 功能。

对于 NetTcpbinding,我们还需要启用以下 Windows 功能。

如果有什么我可以帮忙的,请随时告诉我。