【问题标题】:Eliminate the .svc in the URL of a WCF 4 service using Routes?使用路由消除 WCF 4 服务的 URL 中的 .svc?
【发布时间】:2010-07-20 18:03:18
【问题描述】:

我在 IIS 7.5 上使用 WCF 4,并希望从我的所有 RESTful 服务的 URL 中删除默认的 .svc 扩展名。我已经看到使用 Url Rewrite Module 和 IHttpModule 记录的方法,但我不想采用这些方法。

我对 ASP.NET MVC 中引入的路由概念有点熟悉,据我所知,它们现在从 Net 4 中的 MVC 中抽象出来,称为 System.Web.Routing。但是在查看文档时,我似乎需要将 Global.asax 文件添加到我并不真正热衷的项目中。有没有其他方法可以解决这个问题?

我也看到了基于配置的激活功能,但这似乎只是消除了 .svc 文件,但仍然需要我在服务的 url 中使用 .svc。

谁能在这里总结一下我的 url 中不需要 .svc 的选项?

【问题讨论】:

    标签: wcf rest


    【解决方案1】:

    当然,没问题:首先,阅读 A Developer's Introduction to Windows Communication Foundation 4 中有关 WCF 4 新功能的所有信息。

    您正在寻找的是无文件服务激活。这是您的 <system.serviceModel> 中的一个新设置,如下所示:

    <serviceHostingEnvironment> 
        <serviceActivations>
            <add factory="System.ServiceModel.Activation.ServiceHostFactory" 
                 relativeAddress="[subfolder/]filename.svc" or "~/[subfolder/]filename.svc" 
                 service="SomeNamespace.YourService"/>
        </serviceActivations>
    </serviceHostingEnvironment>
    

    基本上,您在 *.svc 文件中拥有的所有信息(路径、要调用的服务)现在都在此配置部分中。

    您应该可以在

    上调用此服务
    http://yourserver/virtualdirectory/YourService
    

    现在 - 不再有 *.svc,没有凌乱的 URL 重写等 - 它只是简单的工作!

    更新:它似乎没有那么好用,除非你进去并在你的相对路径中添加一个 *.svc 扩展 - kind 破坏了整个目的!

    如果您想使用 ASP.NET 路由进行注册,请查看有关该主题的 MSDN docs。你必须在你的应用程序启动中有这样的东西,在一个网络应用程序中,global.asax.cs

    void Application_Start(object sender, EventArgs e)
    {
        RegisterRoutes(RouteTable.Routes);
    }
    
    private void RegisterRoutes(RouteCollection routes)
    {
        routes.Add(new ServiceRoute("YourService", 
                   new WebServiceHostFactory(), typeof(SomeNamespace.YourService))); 
    }
    

    希望这样,您就可以在没有任何 *.svc 文件扩展名的情况下启动并运行您的服务!

    【讨论】:

    • 您似乎在谈论使用基于配置的激活 (msdn.microsoft.com/en-us/library/ee358764.aspx) 而不是 System.Web.Routing。问题在于,relativeAddress 似乎必须使用 WCF 支持的扩展名(例如 .svc)。我无法让您的示例正常工作,我只是收到错误消息:'配置文件中'system.serviceModel/serviceHostingEnvironment/serviceActivations'部分下的注册 relativeAddress'YourService' 没有扩展名'
    • @BrettRobi:有趣 - MSDN 文章自相矛盾......这与我迄今为止看到/听到的关于无文件激活的所有演示和谈话相反......无论如何,我已经更新了我的答案
    • 是的,我希望它能解决问题,但它看起来确实是一种简单的方法来消除 .svc 文件本身,但不需要 .svc 在 url 中。不过感谢您的帮助...
    • 没有文件扩展名的相对路径导致此错误配置文件中'system.serviceModel/serviceHostingEnvironment/serviceActivations'部分下注册的relativeAddress'RestTestService'没有一个扩展名。 MSDN 说: relativeAddress 属性必须设置为相对地址,例如“&lt;sub-directory&gt;/service.svc”或“~/&lt;sub-directory/service.svc”。
    • @LuizFelipe:抱歉,这不正确。如果您想使用 REST 样式,您必须使用WebServiceHostFactory,并且无法从该代码创建 wsdl 是没有实际意义的 - 因为 REST 服务永远不会无论如何,一个 WSDL 文件,首先....
    【解决方案2】:

    只是为了总结答案并在那里再补充一点。您将需要与上述相同的 ASP.NET 路由注册:

    void Application_Start(object sender, EventArgs e)
    {
        RegisterRoutes(RouteTable.Routes);
    }
    
    private void RegisterRoutes(RouteCollection routes)
    {
        routes.Add(new ServiceRoute("YourService", 
                   new WebServiceHostFactory(), typeof(SomeNamespace.YourService))); 
    }
    

    为了让这个工作你需要添加更多的东西到 web.config。服务托管应配置为与 ASP.NET 兼容。这可以通过将 aspNetCompatibiliyEnabled="true" 添加到 serviceHostingEnvironment 元素来完成:

     <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />
    

    希望这可以澄清并提供更容易找到的解决方案。

    【讨论】:

    • 看看这里为什么你不应该使用WebServiceHostFactory,只使用ServiceHostFactory stackoverflow.com/questions/2921802/…
    • @LuizFelipe,您所指的问题是针对 SOAP 服务,而不是 REST (WebHttp) 服务。这个问题是针对 REST 服务的。在这种情况下,WebServiceHostFactory 是正确的工厂。
    • 是的,改成使用ServiceHostFactory解决了路由问题,但是你得到了一个SOAP服务,你是对的。我错了,如果上面的解决方案不起作用,就用URL路由吧。
    【解决方案3】:

    关于 IIS 7.5 和 Framework 4.0 的重要说明:

    要使 Web 路由模块工作,它需要将应用程序池设置为“集成模式”,它不能在“经典模式”下工作

    我在切换后发现的另一个问题是,当处于“集成模式”时,应用程序在启动时崩溃,因为我在 system.Web> 部分中包含了模块。

    我通过将模块移动到 IIS 7 的新配置部分 system.webServer> 来修复它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-16
      • 1970-01-01
      • 1970-01-01
      • 2011-04-15
      • 1970-01-01
      • 1970-01-01
      • 2010-09-26
      • 1970-01-01
      相关资源
      最近更新 更多