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 功能。
如果有什么我可以帮忙的,请随时告诉我。
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 功能。
如果有什么我可以帮忙的,请随时告诉我。