将WCF服务放在文件夹中会抛出404

时间:2015-08-13 07:11:23

标签: c# wcf

我是WCF的新手并且遇到了以下问题。

我有一个webHttpBinding的WCF服务并托管在IIS上。我的项目类型是WCF应用程序。服务文件Test.svc位于根文件夹中。

我可以从链接http://localhost/WOFAPI/Test.svc访问此内容。到现在为止还挺好。但是,当我在文件夹下放置相同的服务时,请说“测试1”和“测试1”。并且尝试从链接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文件夹中,但没有运气。是否真的可以将它们物理地安排在文件夹中并且无文件夹名称访问?我错过了什么?

非常感谢您的帮助。提前谢谢。

3 个答案:

答案 0 :(得分:1)

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

WCF,MVC和WebAPI依赖System.Web.Routing命名空间来进行路由活动。此命名空间具有类RouteTable。此类的成员Routes的类型为RouteCollection。将您的服务添加到此集合中。

按照以下步骤

1)将System.Web.Routes dll添加到您的项目中(我的项目是WCF应用程序类型,默认情况下没有添加System.Web.Routes dll)

2)添加Global.asax文件

3)将您的服务路线添加到RoutesTable.Routes功能中的Application_Start(object sender, EventArgs e)集合中,如下所示

protected void Application_Start(object sender, EventArgs e)
{
    RouteTable.Routes.Add(new ServiceRoute("Test.svc", new WebServiceHostFactory(), typeof(Test)));
}  

如果您使用Niject WCF进行依赖注入,请按照以下步骤进行操作

1)转到Global.asax(您可能已经拥有继承Global.asax的{​​{1}}个文件)

2)覆盖NinjectHttpApplication功能

3)添加路线如下所示

OnApplicationStarted()

另外,如果您愿意,可以完全摆脱protected override void OnApplicationStarted() { base.OnApplicationStarted(); RouteTable.Routes.Add(new ServiceRoute("Test.svc", new NinjectServiceHostFactory(), typeof(Test))); } 服务扩展。只是不要在路线前缀中添加扩展名。而不是&#34; Test.svc&#34; 只需提供&#34;测试&#34; 。这将导致服务没有扩展。

有了扩展程序 - &gt; .svc
没有扩展名 - &gt; http://localhost/xyz/Test.svc

答案 1 :(得分:0)

您应该配置IIS以了解您的svc文件的位置。

答案 2 :(得分:0)

更改IIS中的应用程序的物理路径