我创建了一个有效的WCF服务。我现在想为它添加一些安全性来过滤Ip地址。我已经按照示例中的microsoft发布样本来尝试添加IDispatchMessageInspector,它将引发调用AfterReceiveRequest,然后如果ip地址不是来自允许列表则抛出错误。
查看代码后;他们使用'wsHttpBinding'配置它,但我想使用'webHttpBinding'或'basicHttpBinding'。但是当我设置它时我得到错误:
'http://upload/api/Api.svc/soap'中的端点没有 使用None MessageVersion绑定。 'System.ServiceModel.Description.WebHttpBehavior'仅适用于 与WebHttpBinding或类似的绑定一起使用。
我的配置是:
<system.serviceModel>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true">
</serviceHostingEnvironment>
<!--Set up the service-->
<services>
<service behaviorConfiguration="SOAPRESTDemoBehavior" name="HmlApi">
<endpoint address="rest" binding="webHttpBinding" contract="VLSCore2.Interfaces.IHmlApi" behaviorConfiguration="SOAPRESTDemoEndpointBehavior" />
<endpoint address="soap" binding="basicHttpBinding" contract="VLSCore2.Interfaces.IHmlApi" behaviorConfiguration="SOAPRESTDemoEndpointBehavior" />
</service>
</services>
<!--Define the behaviours-->
<behaviors>
<serviceBehaviors>
<behavior name="SOAPRESTDemoBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
<!---Endpoint -->
<endpointBehaviors>
<behavior name="SOAPRESTDemoEndpointBehavior">
<ipFilter/>
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
<extensions>
<behaviorExtensions>
<add name="ipFilter" type="VLSCore2.Api.IpFilterBehaviourExtensionElement, VLSCore2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</behaviorExtensions>
</extensions>
</system.serviceModel>
所以我想知道如何在不使用WebHttpBinding的情况下设置我的消息检查器。这甚至可能吗?
我想使用SOAP'basicHttpBinding'而不是wsHttpBinding(和所有WS *)相关的开销....
答案 0 :(得分:41)
这很简单,因为您已为SOAP和REST端点配置了单个endpointBehavior,但SOAP端点不能具有webHttp行为。你需要将它们分开,以便它们是:
<endpointBehaviors>
<behavior name="SOAPDemoEndpointBehavior">
<ipFilter/>
</behavior>
<behavior name="RESTDemoEndpointBehavior">
<ipFilter/>
<webHttp />
</behavior>
</endpointBehaviors>
然后你的终点应该是:
<endpoint address="rest" binding="webHttpBinding" contract="VLSCore2.Interfaces.IHmlApi" behaviorConfiguration="RESTDemoEndpointBehavior" />
<endpoint address="soap" binding="basicHttpBinding" contract="VLSCore2.Interfaces.IHmlApi" behaviorConfiguration="SOAPDemoEndpointBehavior" />
答案 1 :(得分:1)
对我来说,这是因为我将'webHttp'定义为SOAP配置的行为。只有它的缺席解决了它..
答案 2 :(得分:0)
4 天以来,我一直在浏览 MS 文档、堆栈溢出和其他所有内容。在我开始对来自我的服务的请求使用 HTTPS/SSL 后,试图让配置文件正常工作。这个配置文件的设置非常关键。
我不需要修改任何从 HTTP 切换到 HTTPS 的代码,全部都在 web.config 文件 system.serviceModel 部分。
此配置适用于使用 javascript 从 ASP.NET c# WCF 访问 JSON 数据。我好开心!
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="false">
</serviceHostingEnvironment>
<behaviors>
<endpointBehaviors>
<behavior name="webBehavior">
<webHttp />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior>
<!-- To avoid disclosing metadata information, set the values below to false before deployment -->
<serviceMetadata httpsGetEnabled="false"/>
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<webHttpBinding>
<binding name="sfbSecureBinding">
<security mode="Transport">
<transport clientCredentialType="None"/>
</security>
</binding>
</webHttpBinding>
</bindings>
<services>
<service name="buildingsWebService.Service1">
<endpoint address="https://www.azsfb.gov/Service/Service1.svc"
binding="webHttpBinding"
bindingConfiguration="sfbSecureBinding"
contract="buildingsWebService.IService1"
behaviorConfiguration="webBehavior">
</endpoint>
<host>
<baseAddresses>
<add baseAddress="https://www.azsfb.gov/"/>
</baseAddresses>
</host>
</service>
</services>
<protocolMapping>
<add binding="basicHttpBinding" scheme="https"/>
</protocolMapping>