没有.svc的WCF SOAP + REST / Json服务 - 我有两倍的服务工厂数量吗?

时间:2012-02-17 07:48:04

标签: wcf rest soap

好的,所以我希望将单个服务公开为SOAP以及REST(Json)端点。由于它不在“WCF服务应用程序”模板中,因此我有一个web.config并将以下内容添加到...

的web.config

<configuration>
  ...
  <system.serviceModel>
    <services>
        <service name="MySvcClass">
            <endpoint address="" binding="webHttpBinding" contract="MySvcInterfaceClass" behaviorConfiguration="restBehavior" />
            <endpoint address="soap" binding="basicHttpBinding" contract="MySvcInterfaceClass" />
            <endpoint address="mex"  binding="mexHttpBinding" contract="IMetadataExchange" />
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior>
                <serviceMetadata httpGetEnabled="true"/>
                <serviceDebug includeExceptionDetailInFaults="false"/>
            </behavior>
        </serviceBehaviors>
        <endpointBehaviors>
            <behavior name="restBehavior">
                <webHttp helpEnabled="true"/>
            </behavior>
        </endpointBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true"/>
  </system.serviceModel>
  ...
</configuration>

假设MySvcClass类在\ MySvcClass.svc中实现,以上公开......

原始终点

localhost\MySvcClass.svc\(休息终点)

localhost\MySvcClass.svc\mex(元数据交换使用下面的SOAP端点)

localhost\MySvcClass.svc\soap(肥皂终点)

到目前为止,这么好(我想!)。

然后我想摆脱上面路径中看到的丑陋的“.svc”。所以我跟着这个MSDN blog post,并在我的...

的global.asax

void Application_Start(object sender, EventArgs e)
{       
    RouteTable.Routes.Add(new ServiceRoute("MySvcClass", new WebServiceHostFactory(), typeof(MySvcClass)));
}

有趣的是,当我在Application_Start中放置一个断点时,VS2010没有达到这个特定的断点 - 即使我停止 - >开始调试或停止 - >启动IIS应用程序池。离奇!无论如何,回到这一点,我现在可以访问上面列出的端点和服务

清洁终结点

localhost\MySvcClass\(休息终点)

localhost\MySvcClass\mex(元数据交换使用下面的SOAP端点)

localhost\MySvcClass\soap(肥皂终点)

问题

  1. 我有两个服务工厂吗?一个来自web.config,另一个来自global.asax?如果是,我如何在仍然拥有干净的URL(没有.svc)的情况下避免它。我真的不需要在路径中使用.svc的那些......
  2. 我不喜欢凌乱的web.configs,所以有什么办法可以将上面的SOAP和REST配置从XML(web.config)转移到代码中(例如global.asax?)?我知道如何移动REST唯一的终点 - 在web.config中消失,保持global.asax不变。但这样做会杀死SOAP端点。
  3. [更新] 我也尝试过URL重写,但这会在保持REST端点活动的同时杀死SOAP端点。我做的是:在web.config中使用MS的URL Rewrite 2.0模块

    <system.webServer> 
      <modules runAllManagedModulesForAllRequests="true"/> 
      <rewrite> 
        <rules> 
          <rule name="RemoveSvcExt" stopProcessing="true"> 
            <match url="^MySvcClass(.*)$" /> 
            <action type="Rewrite" url="MySvcClass.svc{R:1}" /> 
          </rule> 
        </rules> 
      </rewrite> 
    </system.webServer> 
    

    然而,这会使Web应用程序处于某种不一致的状态,因为有些部分仍然坚持.svc URL。例如:服务端点上的HTML帮助页面显示svcutil.exe http://localhost/MySvcClass.svc?wsdl即使位于http://localhost/MySvcClass?wsdl的干净位置的WSDL也会引用其中的http://localhost/MySvcClass.svc - 这有效地杀死了SOAP端点。

    这就是为什么我认为(0.02美元)重写只是一个问题。叹了口气,此时我正在与框架斗争以完成工作。它感觉到这样的时间燃烧......

2 个答案:

答案 0 :(得分:0)

对于没有.svc的服务,在wcf中搜索文件少的激活 http://www.a2zdotnet.com/View.aspx?Id=188

答案 1 :(得分:0)

我有一个REST项目,因为暴露了REST和SOAP服务。现在,我为一些客户端访问的SOAP服务放置了一个.svc文件。

下面的屏幕截图给出了我的项目的文件夹结构,global.asax中的路由配置,访问Rest服务的输出以及访问.svc文件(SOAP服务)。要删除.svc扩展名,请使用URL重写模块。

sample screenshot

请找到我的web.Config(我的应用程序托管在IIS上):

web.config

请找到我的实现我的接口ISampleService的类:

class