Asp.net Web API未找到与名为的控制器匹配的类型
我看到这个错误被问了很多次,但到目前为止没有运气。我有一个.NET4(VS2010)网站项目。我有一个Web API项目作为一个单独的项目,在同一个解决方案中。我可以从本地机器上的网页调用WebAPI,没问题。我将整个过程推向生产,web api调用失败:Asp.net Web API未找到与名为的控制器匹配的类型,asp.net,asp.net-web-api,webforms,routing,Asp.net,Asp.net Web Api,Webforms,Routing,我看到这个错误被问了很多次,但到目前为止没有运气。我有一个.NET4(VS2010)网站项目。我有一个Web API项目作为一个单独的项目,在同一个解决方案中。我可以从本地机器上的网页调用WebAPI,没问题。我将整个过程推向生产,web api调用失败: {"$id":"1","Message":"No HTTP resource was found that matches the request URI 'http://khdecisiontool.ecitystage.net/api/s
{"$id":"1","Message":"No HTTP resource was found that matches the request URI 'http://khdecisiontool.ecitystage.net/api/slider/69'.","MessageDetail":"No type was found that matches the controller named 'slider'."}
要在Global.asax中注册我所做的一切:
void Application_Start(object sender, EventArgs e)
{
//This enables api controllers in a separate class library
GlobalConfiguration.Configuration.Services.Replace(typeof(IAssembliesResolver), new AssembliesResolver());
GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
// Code that runs on application startup
RegisterRoutes(RouteTable.Routes);
}
我的API路线如下所示:
routes.MapHttpRoute(
name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
).RouteHandler = new ECityHttpControllerRouteHandler();
这是放置在我的web表单路由之后的
编辑
这是控制器:
/// <summary>
/// Api controller for sliders
/// </summary>
[Authorize]
public class SliderController : ApiController
{
SliderService context = new SliderService();
// GET api/slider
/// <summary>
/// Get a list of all sliders as slider dtos
/// </summary>
/// <returns></returns>
public IEnumerable<SliderDto> Get()
{
var sliderList = new List<SliderDto>();
var sliders = context.GetSliders();
foreach (var slider in sliders)
{
var sliderDto = new SliderDto
{
ID = slider.ID,
PersonID = slider.PersonID,
ContentPageID = slider.ContentPageID,
StartValue = slider.StartValue,
EndValue = slider.EndValue,
Date = slider.Date.ToLongDateString() + slider.Date.ToLongTimeString()
};
sliderList.Add(sliderDto);
}
return sliderList.ToList();
}
// GET api/slider/5
/// <summary>
/// Get a single slider as sliderDto
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public SliderDto Get(int id)
{
var slider = context.GetSlider(id);
if (slider != null)
{
var sliderDto = new SliderDto
{
ID = slider.ID,
PersonID = slider.PersonID,
ContentPageID = slider.ContentPageID,
StartValue = slider.StartValue,
EndValue = slider.EndValue,
Date = slider.Date.ToLongDateString() + slider.Date.ToLongTimeString()
};
return sliderDto;
}
return new SliderDto { StartValue = 0, EndValue = 0 };
}
// POST api/slider
/// <summary>
/// Insert a slider
/// </summary>
/// <param name="sliderDto">The slider Dto</param>
/// <returns></returns>
public HttpResponseMessage Post(SliderDto sliderDto)
{
var slider = new Slider
{
ID = sliderDto.ID,
PersonID = sliderDto.PersonID,
ContentPageID = sliderDto.ContentPageID,
StartValue = sliderDto.StartValue,
EndValue = sliderDto.EndValue,
Date = DateTime.Now
};
var id = context.AddSlider(slider);
var item = context.GetSlider(id);
var response = Request.CreateResponse<Slider>(HttpStatusCode.Created, item);
string uri = Url.Link("Default", new { id = id });
response.Headers.Location = new Uri(uri);
return response;
}
// PUT api/slider/5
/// <summary>
/// Update a slider using the SliderDto
/// </summary>
/// <param name="id"></param>
/// <param name="sliderDto"></param>
public void Put(int id, SliderDto sliderDto)
{
try
{
var data = context.GetSlider(id);
data.ID = sliderDto.ID;
data.PersonID = sliderDto.PersonID;
Nullable<int> contentId = null;
if (sliderDto.ContentPageID.HasValue && sliderDto.ContentPageID.Value != 0)
contentId = sliderDto.ContentPageID.Value;
data.ContentPageID = contentId;
data.StartValue = sliderDto.StartValue;
data.EndValue = sliderDto.EndValue;
data.Date = DateTime.Now;
context.UpdateSlider(data);
}
catch (Exception ex)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
}
// DELETE api/slider/5
/// <summary>
/// Delete a slider
/// </summary>
/// <param name="id"></param>
public void Delete(int id)
{
var item = context.GetSlider(id);
if (item == null)
throw new HttpResponseException(HttpStatusCode.NotFound);
context.DeleteSlider(item);
}
}
//
///滑块的Api控制器
///
[授权]
公共类滑块控制器:ApiController
{
SliderService上下文=新建SliderService();
//获取api/滑块
///
///获取所有滑块作为滑块DTO的列表
///
///
公共IEnumerable Get()
{
var sliderList=新列表();
var sliders=context.GetSliders();
foreach(滑块中的变量滑块)
{
var sliderDto=新sliderDto
{
ID=slider.ID,
PersonID=slider.PersonID,
ContentPageID=slider.ContentPageID,
StartValue=滑块。StartValue,
EndValue=滑块。EndValue,
日期=slider.Date.ToLongDateString()+slider.Date.ToLongTimeString()
};
sliderList.Add(SliderTo);
}
返回sliderList.ToList();
}
//获取api/slider/5
///
///获取单个滑块作为SliderTo
///
///
///
要获取的公共滑块(int-id)
{
var slider=context.GetSlider(id);
如果(滑块!=null)
{
var sliderDto=新sliderDto
{
ID=slider.ID,
PersonID=slider.PersonID,
ContentPageID=slider.ContentPageID,
StartValue=滑块。StartValue,
EndValue=滑块。EndValue,
日期=slider.Date.ToLongDateString()+slider.Date.ToLongTimeString()
};
返回滑块到;
}
将新的SliderDto返回到{StartValue=0,EndValue=0};
}
//POST api/滑块
///
///插入滑块
///
///滑块Dto
///
公共httpresponsemessagepost(SliderDto SliderDto)
{
变量滑块=新滑块
{
ID=sliderDto.ID,
PersonID=sliderDto.PersonID,
ContentPageID=sliderDto.ContentPageID,
StartValue=sliderDto.StartValue,
EndValue=sliderDto.EndValue,
日期=日期时间。现在
};
var id=context.AddSlider(slider);
var item=context.GetSlider(id);
var response=Request.CreateResponse(HttpStatusCode.Created,item);
字符串uri=Url.Link(“默认值”,新的{id=id});
response.Headers.Location=新Uri(Uri);
返回响应;
}
//放置api/滑块/5
///
///使用SliderTo更新滑块
///
///
///
公共作废放置(int-id,SliderDto-SliderDto)
{
尝试
{
var data=context.GetSlider(id);
data.ID=sliderDto.ID;
data.PersonID=sliderDto.PersonID;
可为null的contentId=null;
if(sliderDto.ContentPageID.HasValue&&sliderDto.ContentPageID.Value!=0)
contentId=sliderDto.ContentPageID.Value;
data.ContentPageID=contentId;
data.StartValue=sliderDto.StartValue;
data.EndValue=sliderDto.EndValue;
data.Date=DateTime.Now;
context.UpdateSlider(数据);
}
捕获(例外情况除外)
{
抛出新的HttpResponseException(HttpStatusCode.NotFound);
}
}
//删除api/slider/5
///
///删除滑块
///
///
公共无效删除(int-id)
{
var item=context.GetSlider(id);
如果(项==null)
抛出新的HttpResponseException(HttpStatusCode.NotFound);
删除滑块(项目);
}
}
编辑2
以下是程序集解析程序:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Reflection;
/// <summary>
/// Summary description for AssembliesResolver
/// </summary>
public class AssembliesResolver : System.Web.Http.Dispatcher.DefaultAssembliesResolver
{
public override ICollection<Assembly> GetAssemblies()
{
ICollection<Assembly> baseAssemblies = base.GetAssemblies();
List<Assembly> assemblies = new List<Assembly>(baseAssemblies);
var controllersAssembly = Assembly.Load("MyAssemblyName");
baseAssemblies.Add(controllersAssembly);
return assemblies;
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Web;
使用System.Web.Http;
运用系统反思;
///
///AssembliesResolver的摘要说明
///
公共类AssembliesResolver:System.Web.Http.Dispatcher.DefaultAssembliesResolver
{
公共重写ICollection getAssemblys()
{
ICollection baseAssemblys=base.getAssemblys();
列表程序集=新列表(基本程序集);
var controllerassembly=Assembly.Load(“MyAssemblyName”);
BaseSassemblies.Add(controllersAssembly);
返回组件;
}
}
您可以添加控制器定义吗?我怀疑问题出在您的自定义程序集解析器上……您能分享一下它的外观吗?