在文件夹中放置WCF服务会抛出404
本文关键字:服务 WCF 文件夹 | 更新日期: 2023-09-27 18:07:47
我是WCF的新手,遇到了以下问题。
我有一个WCF服务与webHttpBinding
和托管在IIS。我的项目类型是WCF应用程序。业务文件Test.svc
在根目录下。
我可以从链接http://localhost/WOFAPI/Test.svc
访问这个。到目前为止一切顺利。但是,当我将相同的服务放在文件夹下说"Test1"并试图从链接http://localhost/WOFAPI/Test.svc
访问时抛出404。但是当试图从链接http://localhost/WOFAPI/Test1/Test.svc
访问时,它工作('Test1'是放置服务的文件夹的名称)。
Service Behavior配置如下:
<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)
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)));
}
如果您正在使用对象WCF进行依赖注入,请遵循以下步骤
1)转到Global.asax
(您可能已经有Global.asax
文件继承NinjectHttpApplication
)
2)重写OnApplicationStarted()
函数
3)添加如下所示的路由
protected override void OnApplicationStarted()
{
base.OnApplicationStarted();
RouteTable.Routes.Add(new ServiceRoute("Test.svc", new NinjectServiceHostFactory(), typeof(Test)));
}
在一个侧面说明,你可以完全摆脱.svc
扩展的服务,如果你愿意。只是不要在路由前缀中添加扩展名。而不是"测试。svc"给"Test"。这将导致不延长服务。
带扩展名-> http://localhost/xyz/Test.svc
无扩展-> http://localhost/xyz/Test
你应该配置IIS知道你的svc文件在哪里
更改IIS中应用程序的物理路径