在 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 作为第二个端点的主要内容,如果未能解决你的问题,请参考以下文章

在 wcf rest 服务 C# 中使用 Stream 作为输入时缺少第一个元素

尝试 GET 时出现 WCF REST 404

WCF学习——构建第二个WCF应用程序

WCF REST - 使用复杂类型的“获取”

WCF学习——构建第二个WCF应用程序

Android将文件作为ByteArray上传到WCF REST服务