使用Routes消除WCF 4服务的URL中的.svc?

时间:2010-07-20 18:03:19

标签: wcf rest

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

我对ASP.NET MVC中引入的Routes概念非常熟悉,据我所知,它们现在已经从Net4中作为System.Web.Routing从MVC中抽象出来了。但是在查看文档时,我需要将一个Global.asax文件添加到我的项目中,我并不是真的热衷于此。还有其他方法可以解决这个问题吗?

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

有人可以在这里总结我的选项,因为我的网址中不需要.svc吗?

3 个答案:

答案 0 :(得分:9)

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

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

<serviceHostingEnvironment> 
    <serviceActivations>
        <add factory="System.ServiceModel.Activation.ServiceHostFactory" 
             relativeAddress="/YourService" 
             service="SomeNamespace.YourService"/>
    </serviceActivations>
</serviceHostingEnvironment>

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

您应该可以在

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

现在 - 没有更多* .svc,没有杂乱的网址重写等 - 它只是简单的作品!

更新:它看起来效果不好,除非你进入并为你的相对路径添加一个* .svc扩展名 - 这样做会破坏整个目的!

如果要使用ASP.NET路由注册,请查看该主题的MSDN docs。您必须在应用程序启动时使用global.asax.cs的Web应用程序中包含类似内容:

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文件扩展名的情况下启动并运行您的服务!

答案 1 :(得分:5)

只是结束答案并在那里再添加一点。您需要与上面相同的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兼容。这可以通过向serviceHostingEnvironment元素添加aspNetCompatibiliyEnabled =“true”来完成:

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

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

答案 2 :(得分:1)

IIS 7.5和Framework 4.0的重要说明:

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

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

我通过将模块移动到&lt; system.webServer &gt;来修复它。 IIS 7新增的配置部分