在 WCF 中使用 REST GET 作为第二个端点
Posted
技术标签:
【中文标题】在 WCF 中使用 REST GET 作为第二个端点【英文标题】:Using REST GET in WCF as 2nd endpoint 【发布时间】:2020-01-11 09:29:25 【问题描述】:我尝试在现有 WCF 应用程序中添加第二个端点,但我的 REST 方法不起作用。 我创建了新界面
[ServiceContract]
public interface IRestService
[OperationContract]
[WebGet(UriTemplate = "RestURI", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
string SomeMethod();
并在现有服务中实现
public string SomeMethodImplementation()
//some logic
我正在尝试使用 basicaddress/service/RestURI 访问此方法,但收到 400 Bad Request 响应。
之后,我在配置文件中添加了协议映射、第二个端点和端点行为,但它没有帮助。
现在我的配置文件如下所示:
<system.serviceModel>
<protocolMapping>
<add scheme="http" binding="webHttpBinding"/>
</protocolMapping>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- To avoid disclosing metadata information, set the values below to false before deployment -->
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
<!-- 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="false"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="web">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
<services>
<service name="servicename">
<endpoint address="" binding="webHttpBinding" contract="IRestService" behaviorConfiguration="web"/>
<endpoint address="" binding="basicHttpBinding" contract="ISoapService"/>
</service>
</services>
<bindings>
<basicHttpBinding>
<binding maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" receiveTimeout="00:10:00" sendTimeout="00:10:00">
<readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="16348" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
</binding>
</basicHttpBinding>
</bindings>
我不再收到任何 400,而是“由于 EndpointDispatcher 的 AddressFilter 不匹配,无法在接收器处处理”。出现错误。同样在添加protocolMapping 之后,当我在浏览器中打开wsdl 时,我的soap 方法也消失了。没有它,我的 rest 方法可以在列表中看到,如下所示:
<wsdl:port name="BasicHttpBinding_IRestService" binding="i0:BasicHttpBinding_IRestService">
之后,我在我的服务属性中添加了 AddressFilterMode = AddressFilterMode.Any) 但它没有帮助。
我在这里找到了很多答案,但不知何故没有一个可以帮助我解决这个问题。 我错过了什么?
【问题讨论】:
下面的帖子有三个链接。如果您有任何问题,请告诉我。 social.msdn.microsoft.com/Forums/windows/en-US/… 【参考方案1】:我在为 Visual Studio 安装 WCF 后找到了解决方案。一直以来,我的 web.config 中都有错误的命名空间并且不知道,但是 VS 在安装模块后标记了它。我添加了正确的命名空间,问题就消失了。我真的建议在VS中安装WCF。
【讨论】:
【参考方案2】:问题归结为我们未能以 Restful 风格托管服务。 通常有两种方式来配置Webhttpbinding创建的Restful风格的服务。
1.使用service部分配置接口和实现。
<services>
<service name="WcfService3.Service1">
<endpoint address="" binding="webHttpBinding" contract="WcfService3.IService1" behaviorConfiguration="rest"></endpoint>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="rest">
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
有两点我们需要注意。在服务部分,我们应该使用相应的接口和实现。
<service name="WcfService3.Service1">
<endpoint address="" binding="webHttpBinding" contract="WcfService3.IService1"
添加 webhttp 端点行为也很重要,然后使用 Behavior 配置属性应用它。
behaviorConfiguration="mybinding"
在最新的功能中,我们可以创建一个带有协议映射的 WCF Restful 风格的服务。
<endpointBehaviors>
<behavior>
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
<protocolMapping>
<add binding="webHttpBinding" scheme="http"/>
需要注意的是,我们需要添加一个没有名称的端点行为。 根据您的配置,由于您有多个接口,我建议您删除服务部分并使用协议映射功能托管服务。 1.删除配置中的服务部分。 2. 去掉端点行为的名称。
<system.serviceModel>
<protocolMapping>
<add scheme="http" binding="webHttpBinding"/>
</protocolMapping>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- To avoid disclosing metadata information, set the values below to false before deployment -->
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
<!-- 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="false"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior>
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
那么我们就可以通过下面的Uri访问服务了。
基本地址/service.svc/RestURI
如果有什么我可以帮忙的,请随时告诉我。
【讨论】:
以上是关于在 WCF 中使用 REST GET 作为第二个端点的主要内容,如果未能解决你的问题,请参考以下文章