我在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吗?
答案 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新增的配置部分