c# - 将 WCF 服务放入文件夹会抛出 404

标签 c# wcf

我是 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(您可能已经拥有继承NinjectHttpApplicationGlobal.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/

相关文章:

c# - 两个顶点之间的最长路径

c# - 如何以编程方式使系统退出待机状态?

c# - 如何在 Entity Framework Core 2.0 中的模型本身内部使用 OnModelCreating?

wcf - 无法识别VS2010 SvcUtil.exe命令

c# - WCF - 如何有效地发送 GUID(不是字符串)

c# - 同时从两个串口读取

c# - 在 C# 中执行批处理文件

c# - 检查 WCF 服务是否正在运行的最快方法

c# - WCF 客户端字段正在丢失值

c# - 我有一个在现有 WCF 服务中实现的接口(interface),我无法为其添加引用