我是 WCF 新手,并且遇到了以下问题。
我有一个带有 webHttpBinding
的 WCF 服务,并托管在 IIS 上。我的项目类型是WCF应用程序。服务文件 Test.svc
位于根文件夹中。
我可以通过链接http://localhost/WOFAPI/Test.svc
访问它。到目前为止,一切都很好。但是,当我将相同的服务放在“Test1”文件夹下并尝试从链接访问 http://localhost/WOFAPI/Test.svc
时,会抛出 404。但是当尝试从链接访问时http://localhost/WOFAPI/Test1/Test.svc
它可以工作(“Test1”是放置服务的文件夹的名称)。
服务行为配置如下:
<serviceBehaviors>
<behavior name="mexBehavior">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
服务和端点如下:
<service name="Test" behaviorConfiguration="mexBehavior">
<endpoint
address=""
behaviorConfiguration="restfulBehavior"
binding="webHttpBinding"
contract="ITest">
</endpoint>
</service>
我还尝试将它们放在 App_Code
文件夹中,但没有成功。是否真的可以将它们物理地排列在文件夹中并无需文件夹名称即可访问?我错过了什么?
非常感谢您的帮助。提前致谢。
最佳答案
我终于找到了我的问题的解决方案。
WCF、MVC 和 WebAPI 依赖于 System.Web.Routing
命名空间来进行路由事件。该命名空间有一个类RouteTable
。该类有一个 RouteCollection
类型的成员 Routes
。将您的服务添加到此集合中。
按照以下步骤操作
1) 添加System.Web.Routes
dll到你的项目中(我的项目是WCF应用程序类型,默认没有添加System.Web.Routes dll)
2)添加Global.asax
文件
3) 将您的服务路由添加到 Application_Start(object sender, EventArgs e)
函数中的 RoutesTable.Routes
集合,如下所示
protected void Application_Start(object sender, EventArgs e)
{
RouteTable.Routes.Add(new ServiceRoute("Test.svc", new WebServiceHostFactory(), typeof(Test)));
}
如果您使用 Niject WCF 进行依赖注入(inject),请按照以下步骤操作
1)转到Global.asax
(您可能已经拥有继承NinjectHttpApplication
的Global.asax
文件)
2)重写OnApplicationStarted()
函数
3)添加路由如下图
protected override void OnApplicationStarted()
{
base.OnApplicationStarted();
RouteTable.Routes.Add(new ServiceRoute("Test.svc", new NinjectServiceHostFactory(), typeof(Test)));
}
顺便说一句,如果您愿意,您可以完全摆脱服务的 .svc
扩展名。只是不要在路由前缀中添加扩展名。而不是“Test.svc”,只需提供“Test”。这将导致服务无法延期。
带扩展名 -> http://localhost/xyz/Test.svc
没有扩展名 -> http://localhost/xyz/Test
关于c# - 将 WCF 服务放入文件夹会抛出 404,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31981738/