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