Asp.net web api 从aspx页面调用Web API总是导致找不到错误

Asp.net web api 从aspx页面调用Web API总是导致找不到错误,asp.net-web-api,webforms,web-site-project,Asp.net Web Api,Webforms,Web Site Project,我有一个网站项目(其中有一个App_代码文件夹),我已将其升级到.Net 4.5,并在VS 2013中将NuGet package for web API 2.2安装到解决方案中 根文件夹下有一个文件夹“供应商”。在这个文件夹下的一个页面中,我使用jQuery在App_Code文件夹下的控制器类“appsprocurewebappicontroller”中调用PUT Web API方法 在jQuery的ajax调用中使用url:'api/AppsProcureWebApi',总是会导致“找不到错

我有一个网站项目(其中有一个App_代码文件夹),我已将其升级到.Net 4.5,并在VS 2013中将NuGet package for web API 2.2安装到解决方案中

根文件夹下有一个文件夹“供应商”。在这个文件夹下的一个页面中,我使用jQuery在App_Code文件夹下的控制器类“appsprocurewebappicontroller”中调用PUT Web API方法

在jQuery的ajax调用中使用
url:'api/AppsProcureWebApi'
,总是会导致“找不到错误”。 但是如果我硬编码url为
url:'http://localhost/appsprocure/api/AppsProcureWebApi“
在同一个jQuery ajax调用中,它将在Web API方法中工作并执行代码

问题:我是否需要在global.asax中使用一些特殊的路由配置,以使其与原始url一起工作,或者我还需要做一些其他事情?(下面提到了用于在global.asax中配置路由的代码)

jQuery用于从/Vendors/EditProduct.aspx页面调用Web API

function SaveProdDesc() {
            var data = {
                productId: $find("<%= radcomBoxProducts.ClientID%>").get_value(),
                productDescription: $("#<%= txtProdDesc.ClientID%>").val(),
                originalProductDescription: $("#<%= hfOrigProdDesc.ClientID%>").val()
            }
            $.ajax({
                url: 'api/AppsProcureWebApi',
                type: 'PUT',
                data: JSON.stringify(data),
                contentType: "application/json",
                dataType:"json",
                success: function (data) {
                    alert(data);
                },
                error: function (x, y, z) {
                    alert(x + '\n' + y + '\n' + z);
                }
            });
        }
应用程序代码下的Web API控制器类如下所示。

    public class AppsProcureWebApiController : ApiController
{
    //OTHER METHODS ARE OMITTED TO SAVE SPACE

    [HttpPut]
    [Authorize]
    public int Put(ProductDesc p)
    {
        string prodDesc = p.ProductDescription;
        return ApplicationDataAccess.UpdateProductDescription(p.ProductId, ref prodDesc, p.OriginalProductDescription);
    }

}

public class ProductDesc
{
    public long ProductId { get; set; }
    public string ProductDescription { get; set; }
    public string OriginalProductDescription { get; set; }
}

经过多次尝试,我找到了答案。这在使用来自aspx页面的jQuery在webforms asp.net项目中调用Web API时非常有用,因为在此类项目中,页面将位于不同的文件夹下

只需要一个简单的更改,就可以使用
url:'API/appsprocurewebpi'
从文件夹“Vendors”下的aspx页面无缝调用Web API

这个简单的更改是将供应商添加到路由配置中。如果让原始规则存在,请确保将此新路由规则命名为不同的名称,即
DefaultApi
以外的名称。我在下面的代码中将这条新规则命名为
Rule1Api

因此,在路由配置中,
api/{controller}/{id}
变成了
vendors/api/{controller}/{id}
,如下代码所示。但是不要更改jQuery调用中提到的url,这意味着让它成为
url:api/AppsProcureWebApi
,因为
供应商
将自动添加到jQuery调用中提到的url之前

void Application_Start(object sender, EventArgs e)
{
      //below code to make Web API work in Webforms
          RouteTable.Routes.MapHttpRoute( name: "Rule1Api", 
               routeTemplate: "vendors/api/{controller}/{id}", 
               defaults: new { id = System.Web.Http.RouteParameter.Optional });
}
void Application_Start(object sender, EventArgs e)
{
      //below code to make Web API work in Webforms
          RouteTable.Routes.MapHttpRoute( name: "Rule1Api", 
               routeTemplate: "vendors/api/{controller}/{id}", 
               defaults: new { id = System.Web.Http.RouteParameter.Optional });
}