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}");
这样就可以了!
我正在尝试将 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}");
这样就可以了!