【问题标题】:Web Api 2 route configuration with legacy asmx services in api folderWeb Api 2 路由配置与 api 文件夹中的旧 asmx 服务
【发布时间】:2015-04-04 01:48:46
【问题描述】:

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

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

样品服务: /Api/ApiServ.asmx - 我可以使用方法列表调用初始屏幕

问题是当我尝试在其中一项服务上调用任何方法时,例如/Api/ApiServ.asmx/ServMethod - 我无法调用它,我收到以下响应:“未找到与请求 URI 'http://localhost:49415/api/apiserv.asmx/ServMethod'匹配的 HTTP 资源”

这是我所拥有的: 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 忽略路由,但服务方法没有被命中。任何帮助表示赞赏!

【问题讨论】:

    标签: c# asp.net web-services asp.net-web-api


    【解决方案1】:

    我实际上并没有找到合适的解决方案,因为我已经没有时间来解决这个问题了,但是由于解决方案是临时的,并且会将 asmx 服务移动到 web 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);
        }
    }
    

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

    【讨论】:

      【解决方案2】:

      如果你的 API 有 mvc 部分(web api 帮助页面将添加 mvc)

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

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

      这样就行了!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-27
        • 2013-12-28
        • 2013-10-17
        • 2018-07-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多