2014-10-27 31 views
0

我有一个网站项目(具有App_Code文件夹的项目),我已升级到.Net 4.5,并将用于Web API 2.2的NuGet软件包安装到VS 2013中的解决方案。从aspx页面调用Web API始终导致未找到错误

在根文件夹下有一个文件夹'Vendors'。从该文件夹下的页面,我使用jQuery在App_Code文件夹下的控制器类“AppsProcureWebApiController”内调用PUT Web API方法。

在jQuery的ajax调用中使用url: 'api/AppsProcureWebApi'总是会导致'未找到错误'。 Not Found Error 但是,如果我在相同的jQuery ajax调用中将url编码为url:'http://localhost/appsprocure/api/AppsProcureWebApi',那么它将工作并在Web API方法中执行代码。

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

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

在Global.asax中定义
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); 
       } 
      }); 
     } 

路由

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

App_Code文件下的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; } 
} 

回答

0

我找到答案了很多努力之后。这对于从aspx页面使用jQuery来调用webforms asp.net项目中的Web API时非常有用,因为在这些项目中页面将存在于不同的文件夹下。

只需进行简单的更改即可使用url: 'api/AppsProcureWebApi'从文件夹'Vendors'下的aspx页无缝调用Web API。

这个简单的改变是将vendors添加到路由配置。如果您让原始规则在那里,请确保您以不同的方式命名此新的路由规则,即DefaultApi以外的内容。我在下面的代码中将此新规定为Rule1Api

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

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 }); 
}