【问题标题】:RoutePrefix in web apiWeb api中的RoutePrefix
【发布时间】:2016-11-18 06:56:21
【问题描述】:

我使用 .net framework 4.0web api 1

我需要使用属性RoutePrefix,它在web api 2中。

第一个 web api 中有模拟吗?

在 Web API 2 中:

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

我的 WebApiConfig:

public static class WebApiConfig
{
    //public static JsonSerializerSettings JsonSerializerSettings { get; private set; }
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
        config.Routes.MapHttpRoute(
            name: "FileApi",
            routeTemplate: "api/file/{action}/{fileName}",
            defaults: new { controller = "File", action = "Get", id = RouteParameter.Optional }
        );
    }
}

我的角度工厂:

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

我需要改变什么来解决它?

【问题讨论】:

  • 如您所知,路由前缀已添加到 web api 2。我相信有一些第三方项目最初试图做同样的事情,但你必须检查存储库。有没有办法升级到 web api 2
  • .net framework 4 与我所知道的 web api 2 不兼容。
  • 在 webApiConfig 中我需要添加哪个路由才能通过 api/photo 获取 PhotoController?
  • 基于通用约定的默认路由 api/{controller} 应该可以工作。您仍然可以创建一个特定于照片控制器config.Routes.MapHttpRoute( name: "PhotoApi", routeTemplate: "api/photo/{id}", defaults: new { controller = "Photo", id = RouteParameter.Optional } );

标签: c# asp.net .net asp.net-web-api asp.net-web-api-routing


【解决方案1】:

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

在路由表中注册路由的顺序很重要,因为第一个匹配的路由获胜。在更一般的路由之前先注册更具体的路由,以避免错误匹配。

【讨论】:

  • 浏览器控制台中的错误:angular.js:12011 GET localhost:1300/api/photo 404(未找到)。但是,如果像这样(手动)编写 url:localhost:1300/api/photo/get/Album 它工作正常。
  • 更新您的问题并显示控制器。 route 可能缺少默认操作。
  • 更改问题
  • 注册路径的顺序很重要。将文件路由放在默认路由之前
  • 还注意到您有FileController 而不是PhotoController。清楚你想要什么。你的例子令人困惑
猜你喜欢
  • 2014-09-17
  • 1970-01-01
  • 1970-01-01
  • 2015-03-29
  • 2016-06-26
  • 2014-07-29
  • 2015-10-09
  • 1970-01-01
  • 2015-12-10
相关资源
最近更新 更多