IIS上的WCF服务。如何摆脱URL路径中的“Service.svc”组件?

时间:2012-07-11 20:04:15

标签: c# .net wcf iis wcf-binding

我在IIS上托管了WCF服务。出于商业原因,我无法发布此实例的公共网址,但我相信您会理解我的意思:

问题是,为了到达我的端点,似乎我已将Service.svc作为路径段的一部分,即我必须使用这样的网址:

http://<domain>/<app-name>/Service.svc/<relative-path>

我该如何避免这种情况?我的意思是,我想通过以下方式访问我的服务:

http://<domain>/<app-name>/<relative-path>

当我在开发过程中自我托管服务时,我完全能够做到这一点。


最后,但这并非如此超越,浏览到http://<domain>/<AppName>/Service.svc网址会显示标准服务信息页面:

有没有办法可以防止这种情况被发现?

enter image description here

4 个答案:

答案 0 :(得分:5)

第一部分:没有URL的“service.svc”部分,可以使用ASP.NET路由功能,ServiceRoute类 - 路由的前缀是空字符串。 http://blogs.msdn.com/b/endpoint/archive/2010/01/25/using-routes-to-compose-wcf-webhttp-services.aspx上的帖子显示了如何做到这一点。

第二部分:为防止显示“帮助”页面,您可以通过配置(或使用自定义服务主机工厂的代码)禁用它。以下是通过config实现的方法:

<serviceBehaviors>
    <behavior>
        <serviceDebug httpHelpPageEnabled="false" httpsHelpPageEnabled="false"/>
    </behavior>
</serviceBehaviors>

该行为没有“name”属性,这意味着它将用作服务的默认行为。

答案 1 :(得分:3)

像我这样的.net newbs的分步说明:

  1. 打开Web.config文件并确保aspNetCompatibilityEnabled设置为true:

    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
    
  2. 右键单击该项目,单击添加 - >新项目。找到“全球应用程序类”。这将自动生成Global.asax文件。

  3. 打开Global.asax文件并确保Application_Start方法如下所示:

    protected void Application_Start(object sender, EventArgs e)
    {
        RouteTable.Routes.Add(new ServiceRoute("", new ServiceHostFactory(), typeof(MyServiceImplementation)));
    }
    
  4. (使用Service1.svc中调用的任何类更改MyServiceImplementation

    1. 确保您添加了以下参考资料:

      using System.ServiceModel.Activation;
      using System.Web.Routing;
      
    2. 如果找不到这些并且您使用的是早于.net 4.5的内容,请确保使用完整安装而不是客户端安装。还要确保已添加这些软件包引用(右键单击项目,单击添加 - >参考,找到软件包名称并确保已选中)。

      1. 重新启动IIS。现在应该隐藏Service1.svc(或任何你的名字)文件。

答案 2 :(得分:1)

您只需不公开服务元数据即可达到此目的 - 只需注释端点

即可
 <endpoint address="mex" binding="mexHttpBinding" name="IMetadataExchange_mexHttpBinding" contract="IMetadataExchange" />

根据网址 - 我只是同意@Edmund Y--他提供了有用的链接

答案 3 :(得分:0)

我只是想知道我为实施@ carlosfigueira的建议做了什么是最干净的事情:

我最终使用了Global.asax文件并在ServiceRoute处理程序中添加了带有 routePrefix Application_Start。我不太确定为什么我正在使用WebServiceHostFactory vs ServiceHostFactory,正如我在@Edmund Y分享的文章中所读到的那样: ServiceRoute + WebServiceHostFactory kills WSDL generation? How to create extensionless WCF service with ?wsdl

无论如何,我认为我设法解决了我需要的问题,感谢您的帮助。