我在IIS上托管了WCF服务。出于商业原因,我无法发布此实例的公共网址,但我相信您会理解我的意思:
问题是,为了到达我的端点,似乎我已将Service.svc
作为路径段的一部分,即我必须使用这样的网址:
http://<domain>/<app-name>/Service.svc/<relative-path>
我该如何避免这种情况?我的意思是,我想通过以下方式访问我的服务:
http://<domain>/<app-name>/<relative-path>
当我在开发过程中自我托管服务时,我完全能够做到这一点。
最后,但这并非如此超越,浏览到http://<domain>/<AppName>/Service.svc
网址会显示标准服务信息页面:
有没有办法可以防止这种情况被发现?
答案 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的分步说明:
打开Web.config
文件并确保aspNetCompatibilityEnabled
设置为true:
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
右键单击该项目,单击添加 - >新项目。找到“全球应用程序类”。这将自动生成Global.asax文件。
打开Global.asax文件并确保Application_Start
方法如下所示:
protected void Application_Start(object sender, EventArgs e)
{
RouteTable.Routes.Add(new ServiceRoute("", new ServiceHostFactory(), typeof(MyServiceImplementation)));
}
(使用Service1.svc中调用的任何类更改MyServiceImplementation
)
确保您添加了以下参考资料:
using System.ServiceModel.Activation;
using System.Web.Routing;
如果找不到这些并且您使用的是早于.net 4.5的内容,请确保使用完整安装而不是客户端安装。还要确保已添加这些软件包引用(右键单击项目,单击添加 - >参考,找到软件包名称并确保已选中)。
答案 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
无论如何,我认为我设法解决了我需要的问题,感谢您的帮助。