Web Api 2 路由配置,在 api 文件夹中使用旧版 asmx 服务

Web Api 2 route configuration with legacy asmx services in api folder

我正在尝试将 Web Api 功能添加到现有 ASP.NET 应用程序。这应该很简单,但我已经坚持了几个小时。我已经尝试了很多东西,但到目前为止没有运气。

该应用程序在“/api”文件夹中有多个 asmx 服务。这会以某种方式干扰网络 api 路由。理想情况下,我想将现有服务保留在当前位置,因为有对它们的外部引用。

示例服务: /Api/ApiServ.asmx - 我可以使用方法 list

调用初始屏幕

问题是当我尝试调用其中一项服务的任何方法时,例如/Api/ApiServ.asmx/ServMethod - 我无法调用它,我收到了这样的回复:"No HTTP resource was found that matches the request URI 'http://localhost:49415/api/apiserv.asmx/ServMethod'"

这是我的资料: Global.asax:

public class WebApiApplication : HttpApplication
{
    protected void Application_Start()
    {            
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        //RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }
}

示例服务:

namespace WebApiTest.Api
{
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [ToolboxItem(false)]    
    [ScriptService]
    public class ApiServ : WebService
    {
        [WebMethod]
        public string ServMethod()
        {
            return "Test";
        }
    }
}

Web Api 配置:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.IgnoreRoute("asmx", "api/{resource}.asmx/{*pathInfo}");           

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

奇怪的是,当我使用路由调试器时,它实际上与 asmx 忽略路由匹配,但服务方法没有被命中。任何帮助表示赞赏!

我实际上并没有想出一个合适的修复方法,因为我 运行 已经没有时间来修复这个问题了,但是因为这个解决方案是临时的,并且会将 asmx 服务转移到网络上 api 控制器我决定采用一种解决方法。

这就是我所做的: 1) 在 /Api 文件夹中,我创建了一个 /Legacy 子文件夹,并将所有 asmx 服务移至那里

2) 在 global.asax Application_BeginRequest:

private void Application_BeginRequest(object sender, EventArgs e)
{
    string url = Request.Url.AbsolutePath.ToLower();

    if (url.StartsWith("/api") && url.Contains(".asmx") && !url.Contains("/api/legacy/"))
    {
        url = Request.Url.AbsolutePath.Replace("/api/", "/api/legacy/");

        Context.RewritePath(url);
    }
}

请注意,类似的事情可以通过更文明的方式实现,例如使用重写模块,但这对我来说是一个临时解决方案。

如果您的 API 确实有 mvc 部分(网络 api 帮助页面将添加 mvc)

您需要将以下行添加到您的 RouteConfig.cs:

routes.IgnoreRoute("{resource}.asmx/{*pathInfo}");

这样就可以了!