C# 从ASP.Net网站Webforms调用ASP.Net Web API

C# 从ASP.Net网站Webforms调用ASP.Net Web API,c#,asp.net-mvc,asp.net-web-api,C#,Asp.net Mvc,Asp.net Web Api,在过去的几个小时里,我一直在尝试执行asp.netwebforms网站中托管的webapi操作。 我知道它是有线的,但由于旧的项目设计,我不得不这样做。每次我在控制器中调用动作时 {"Message":"No HTTP resource was found that matches the request URI 'http://localhost:3049/api/chart/test?id=58'.","MessageDetail":"No action was found on the c

在过去的几个小时里,我一直在尝试执行
asp.netwebforms网站中托管的
webapi操作
。 我知道它是有线的,但由于旧的项目设计,我不得不这样做。每次我在
控制器中调用动作时

{"Message":"No HTTP resource was found that matches the request URI 'http://localhost:3049/api/chart/test?id=58'.","MessageDetail":"No action was found on the controller 'Chart' that matches the request."}
我的项目结构如下:-

我的类代码看起来非常简单:-

public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services
            config.EnableCors();

            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new {id = RouteParameter.Optional }
            );
            config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));

        }
    } 
我的控制器:-

[EnableCors(origins: "*", headers: "*", methods: "*")]
public class ChartController : ApiController
{
    [HttpGet]
    public static string test(string id)
    {
        return id;
    }
}

我错过了什么?

让你的动作方法非静态。在微软的文档中,他们这样说:

控制器上的哪些方法被视为“操作”?选择操作时,框架只查看控制器上的公共实例方法

此外,您的路由的形式是
api/{controller}/{id}
,但您正在访问的URL的形式是
/api/controller/action?id=string
。注意到不匹配吗?您可以更改操作方法以匹配路线

[HttpGet]
public string Get(string id)
{
    return id;
}
然后访问
/api/chart/58

使用Web API中的默认路由结构,您的路由将告诉它所选的控制器、所选的操作方法基于HTTP方法(GET、POST、PUT、DELETE、HEAD、OPTIONS、PATCH)和参数,然后URL的其他段将成为参数


了解更多详细信息。

我从未见过这样的
静态
控制器方法。它不应该是一个实例方法吗?此外,路由映射似乎并不意味着在路由中使用操作名称。根据WebAPI的版本,您可能需要简单地命名方法
Get
,而不是
test