在文件夹中放置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服务会抛出404

我终于找到了解决问题的办法。

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)));
}  

如果您正在使用对象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中应用程序的物理路径