我有一个网站项目(具有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'
总是会导致'未找到错误'。 但是,如果我在相同的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; }
}