C# web api中的RoutePrefix
我使用.net framework 4.0和web api 1 我需要使用属性RoutePrefix,它位于WebAPI2中 在第一个web api中有模拟吗 在Web Api 2中:C# web api中的RoutePrefix,c#,asp.net,.net,asp.net-web-api,asp.net-web-api-routing,C#,Asp.net,.net,Asp.net Web Api,Asp.net Web Api Routing,我使用.net framework 4.0和web api 1 我需要使用属性RoutePrefix,它位于WebAPI2中 在第一个web api中有模拟吗 在Web Api 2中: [RoutePrefix("api/file")] public class FileController : ApiController { ... 我的Api控制器: public class FileController : ApiController { private IFileManage
[RoutePrefix("api/file")]
public class FileController : ApiController
{
...
我的Api控制器:
public class FileController : ApiController
{
private IFileManager fileManager;
public FileController()
: this(new LocalFileManager(HttpRuntime.AppDomainAppPath + @"\Album"))
{
}
public FileController(IFileManager fileManager)
{
this.fileManager = fileManager;
}
// GET: api/Photo
[HttpGet]
public async Task<HttpResponseMessage> Get()
{
var results = await fileManager.Get();
return Request.CreateResponse(HttpStatusCode.OK, new { photos = results });// (new { photos = results });
}
// POST: api/Photo
[HttpPost]
public async Task<HttpResponseMessage> Post()
{
// Check if the request contains multipart/form-data.
if (!Request.Content.IsMimeMultipartContent("form-data"))
{
return Request.CreateResponse(HttpStatusCode.BadRequest, "Unsupported media type");// BadRequest("Unsupported media type");
}
try
{
var photos = await fileManager.Add(Request);
return Request.CreateResponse(HttpStatusCode.OK, new { Message = "Photos uploaded ok", Photos = photos });// Ok(new { Message = "Photos uploaded ok", Photos = photos });
}
catch (Exception ex)
{
return Request.CreateResponse(HttpStatusCode.BadRequest, ex.GetBaseException().Message);// BadRequest(ex.GetBaseException().Message);
}
}
// DELETE: api/Photo/5
[HttpDelete]
[ActionName("{fileName}")]
public async Task<HttpResponseMessage> Delete(string fileName)
{
if (!this.fileManager.FileExists(fileName))
{
return Request.CreateResponse(HttpStatusCode.NotFound);// NotFound();
}
var result = await this.fileManager.Delete(fileName);
if (result.Successful)
{
return Request.CreateResponse(HttpStatusCode.OK, new { message = result.Message });// Ok(new { message = result.Message });
}
else
{
return Request.CreateResponse(HttpStatusCode.BadRequest, result.Message);// BadRequest(result.Message);
}
}
}
我的角工厂:
function fileManagerClient($resource, $http) {
return $resource("api/file/:fileName",
{ fileName: "@fileName" },
{
'query': { method: 'GET' },
'save': { method: 'POST', transformRequest: angular.identity, headers: { 'Content-Type': undefined } },
'remove': { method: 'DELETE', url: 'api/file/:fileName', params: { name: '@fileName' } }
});
我需要改变什么来修复它
在WebApiConfig中,我需要添加哪个路由来获取FileController
通过api/文件
带有
api/{controller}
的基于通用约定的默认路由应该可以工作。如果您想以文件控制器为目标,仍然可以创建一个特定于该控制器的文件
public static class WebApiConfig {
public static void Register(HttpConfiguration config) {
// Convention-based routing.
//GET api/file
//POST api/file
//DELETE api/file/somefilename
config.Routes.MapHttpRoute(
name: "FileApi",
routeTemplate: "api/file/{fileName}",
defaults: new { controller = "File", fileName = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
在路由表中注册路由的顺序很重要,因为第一个匹配的路由获胜。先注册更具体的路由,再注册更一般的路由,以避免错误匹配
在WebApiConfig中,我需要添加哪个路由来获取FileController
通过api/文件
带有
api/{controller}
的基于通用约定的默认路由应该可以工作。如果您想以文件控制器为目标,仍然可以创建一个特定于该控制器的文件
public static class WebApiConfig {
public static void Register(HttpConfiguration config) {
// Convention-based routing.
//GET api/file
//POST api/file
//DELETE api/file/somefilename
config.Routes.MapHttpRoute(
name: "FileApi",
routeTemplate: "api/file/{fileName}",
defaults: new { controller = "File", fileName = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
在路由表中注册路由的顺序很重要,因为第一个匹配的路由获胜。首先注册更具体的路由,然后再注册更一般的路由,以避免错误匹配。如您所知,web api 2中添加了路由前缀。我相信有一些第三方项目最初也尝试过这样做,但您必须检查存储库。没有办法升级到web api 2.net framework 4吗?据我所知,它与web api 2不兼容。在webApiConfig中,我需要添加哪些路由以通过api/photo获取光控制器?基于通用约定的默认路由
api/{controller}
应该可以工作。您仍然可以创建一个特定于photo controllerconfig.Routes.MapHttpRoute(名称:“PhotoApi”,routeTemplate:“api/photo/{id}”,默认值:new{controller=“photo”,id=RouteParameter.Optional})代码>路由前缀已添加到web api 2中,如您所知。我相信有一些第三方项目最初也尝试过这样做,但您必须检查存储库。没有办法升级到web api 2.net framework 4吗?据我所知,它与web api 2不兼容。在webApiConfig中,我需要添加哪些路由以通过api/photo获取光控制器?基于通用约定的默认路由api/{controller}
应该可以工作。您仍然可以创建一个特定于photo controllerconfig.Routes.MapHttpRoute(名称:“PhotoApi”,routeTemplate:“api/photo/{id}”,默认值:new{controller=“photo”,id=RouteParameter.Optional})浏览器控制台中的代码>错误:angular.js:12011 GET 404(未找到)。但是,如果你这样写url(用手):效果很好。更新你的问题并显示控制器。路由可能缺少默认操作。更改注册表路由的顺序很重要。将文件路由置于默认路由之前。因此,注意到您有FileController
,而没有PhotoController
。清楚你想要的是什么。您的示例是浏览器控制台中的Confusinger错误:angular.js:12011 GET 404(未找到)。但是,如果你这样写url(用手):效果很好。更新你的问题并显示控制器。路由可能缺少默认操作。更改注册表路由的顺序很重要。将文件路由置于默认路由之前。因此,注意到您有FileController
,而没有PhotoController
。清楚你想要的是什么。你的例子令人困惑