【问题标题】:WCF 3.5 running SOAP and REST services side by side in IISWCF 3.5 在 IIS 中并排运行 SOAP 和 REST 服务
【发布时间】:2011-04-18 15:51:31
【问题描述】:

我知道这里有人问过类似的问题:

Running SOAP and RESTful on the same URL

Hosting WCF soap and rest endpoints side by side

但没有找到我的问题的答案。

我有两个启用依赖注入的自定义服务主机工厂:

public class StructureMapSoapServiceHostFactory : ServiceHostFactory 
public class StructureMapRestServiceHostFactory : WebServiceHost2Factory

这里的实现细节并不重要。

然后我在 web.config 中定义了两个端点

<system.serviceModel>
    <behaviors>
   <serviceBehaviors>
    <behavior name="mexGet">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
   </serviceBehaviors>
  <endpointBehaviors>
    <behavior name="jsonBehavior">
      <webHttp/>
    </behavior>
  </endpointBehaviors>
</behaviors>
<bindings>
  <mexHttpBinding>
    <binding name="mexHttpBinding" />
  </mexHttpBinding>
</bindings>
      <services>
     <service behaviorConfiguration="mexGet" name="ServiceImplementation.ServiceCategory">
        <endpoint address="rest" 
                  binding="webHttpBinding" 
                  contract="Contracts.ServiceContracts.Mobile.IServiceCategory"
                  behaviorConfiguration ="jsonBehavior"/>
        <endpoint address="soap"
                  binding="basicHttpBinding"
                  contract="Contracts.ServiceContracts.Mobile.IServiceCategory" />
        <endpoint name="mexHttpBinding"
                  address="mex"
                  binding="mexHttpBinding" bindingConfiguration="mexHttpBinding"
                  contract="IMetadataExchange" />
     </service>
  </services>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>

然后我为每个自定义主机工厂创建了两个 .svc 文件: ServiceCategoryRest.svc ServiceCategorySoap.svc

我不喜欢它。我想做的是拥有那种风格的网址:

REST : http://server:port/rest/categories/{id} 映射到我的 ServiceCategory.GetCategory(int id) 的实现

SOAP:http://server:port/soap/GetCategory?id=someId

我的问题是。我需要不同的 svc 文件来激活主机服务吗?如果我需要两个 .svc 文件,如何实现上面的 URI?恐怕我应该配置 IIS 重写或其他东西,但想避免这种情况。

提前感谢您的帮助。

托马斯

【问题讨论】:

    标签: wcf rest soap


    【解决方案1】:

    您可以使用服务路由来实现您正在寻找的东西 - ASP.NET 路由的一部分,从 ASP.NET 3.5 SP1 开始可用。

    查看这些资源:

    在 .NET 3.5 SP1 中,您需要在 web.config 中添加一些额外的基础设施(网络路由模块等) - 而在 .NET 4 中,这一切都已内置。

    【讨论】:

    • 感谢您的回答。我阅读了您提供的链接文章并有更多问题:注册从 ServiceHostFactory 派生的自定义 serviceHostfactory 时将使用哪个绑定?派生自 WebServiceHostFactory2 的那个将使用 webHttpBinding 并且确定。下一个问题是,我可以将复杂类型作为参数传递给 WCF 中的操作作为 RESTful 服务吗?我认为这是不可能的,但在阅读了您提供的文章后,它似乎是。
    • 此外,所有示例均适用于 Framework 4.0,而 3.5 则没有,例如没有 ServiceRoute 类等。
    • @Thomas Jaskula:抱歉,找不到任何 NET 3.5 的博文了 - 但我知道,通过一些额外的设置,在 .NET 3.5 SP1 中也可以。
    • 我想我会按照 Rick Strahl 的博文west-wind.com/weblog/posts/570695.aspx 来实现它
    【解决方案2】:

    经过几次搜索,我发现实际上我不需要两个不同的 .svc 文件和两个不同的 ServiceHostFactories。

    我只保留了 StructureMapRestServiceHostFactory : WebServiceHost2Factory 和 ServiceCategoryRest.svc,它们在 REST 模式下处理好请求并在 RPC-SOAP 模式下调用。

    因此,如果您想同时运行 REST 和 SOAP,您只能使用 WebServiceHost2Factory。

    如果您想从 URL 中删除 .svc 部分,请阅读 Rick Strahl 的帖子 west-wind.com/weblog/posts/570695.aspx。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-29
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 2019-08-15
      • 2010-09-16
      • 2013-01-24
      相关资源
      最近更新 更多