我是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
文件夹中,但没有运气。是否真的可以将它们物理地安排在文件夹中并且无文件夹名称访问?我错过了什么?
非常感谢您的帮助。提前谢谢。
答案 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中的应用程序的物理路径