【问题标题】:Put method not available (or visible in Help)放置方法不可用(或在帮助中可见)
【发布时间】:2015-11-17 13:47:49
【问题描述】:

我有一个具有以下 PUT 方法的 Web API 2 控制器 (PersonProfessionController):

[HttpPut]
[AcceptVerbs("PUT")]
public void Put([FromBody]PersonProfessionModel value)
{
    try
    {
        this.MyProfessionManager.Save(value.ToPersonProfession());
    }
    catch (Exception ex)
    {
        this.LogManager.Error(ex);
    }
}

由于某种原因,它只是不可用。它在 api 帮助概览页面中也不可见。

另一方面,我的 PersonController 中有一个方法,如下所示:

[HttpPut]
[AcceptVerbs("PUT")]
public void Put([FromBody]PersonModel value)
{
    try
    {
        this.MyPersonManager.Save(value.ToPerson());
    }
    catch (Exception ex)
    {
        this.LogManager.Error(ex);
    }
}

这很好用。

问题

虽然 PersonController 的 PUT 方法看起来和我的 PersonProfessionController 非常相似,但除了明显的区别外,前者有效,后者无效(甚至不可见)。

知道发生了什么吗?

更新

每个请求的完整 PersonProfessionController 类:

public class PersonProfessionController : ApiController
{
    private IPersonProfessionManager PersonProfessionManager { get; set; }
    private ILogManager LogManager { get; set; }

    public PersonProfessionController(
        IPersonProfessionManager PersonProfessionManager,
        ILogManager logManager)
    {
        this.PersonProfessionManager = PersonProfessionManager;
        this.LogManager = logManager;
    }

    [HttpGet]
    public IHttpActionResult Get(string languageCode, Guid id)
    {
        try
        {
            var result = this.PersonProfessionManager.Get(languageCode, id);

            if (result == null)
                return NotFound();

            return Ok(result);
        }
        catch (Exception ex)
        {
            this.LogManager.Error(ex);
        }

        return NotFound();
    }

    #region Save

    // PUT api/PersonProfession/save/
    [HttpPut]
    [AcceptVerbs("PUT")]
    public void Put([FromBody]PersonPersonProfessionModel value)
    {
        try
        {
            this.PersonProfessionManager.Save(value.ToPersonProfession());
        }
        catch (Exception ex)
        {
            this.LogManager.Error(ex);
        }
    }

    #endregion

    [HttpGet]
    public IHttpActionResult LoadPersonProfessionsForPersonAndDossier(
        string languageCode,
        Guid dossierId,
        Guid personId
        )
    {
        try
        {
            var contextInformation = new ContextInformation
            {
                LanguageCode = languageCode,
                DossierId = dossierId,
                PersonId = personId
            };

            var result = this.PersonProfessionManager.LoadPersonProfessionsForPersonAndDossier(contextInformation);

            if (result == null)
                return NotFound();

            return Ok(result);
        }
        catch (Exception ex)
        {
            this.LogManager.Error(ex);
        }

        return NotFound();
    }
}

我手动更改了代码以使其品牌中立,如果我进行不同的更改,这可能会导致不一致。

每个请求的路由:

config.Routes.MapHttpRoute(
    name: "Get PersonProfession",
    routeTemplate: "api/personprofession/{languageCode}/{id}",
    defaults: new
    {
        controller = "PersonProfession",
        action = "Get",
        languageCode = RouteParameter.Optional,
        id = RouteParameter.Optional
    });

config.Routes.MapHttpRoute(
    name: "LoadPersonProfessionsForPersonAndDossier",
    routeTemplate: "api/personprofession/LoadPersonProfessionsForPersonAndDossier/{languageCode}/{dossierId}/{personId}",
    defaults: new
    {
        controller = "PersonProfession",
        action = "LoadPersonProfessionsForPersonAndDossier",
        languageCode = RouteParameter.Optional,
        dossierId = RouteParameter.Optional,
        personId = RouteParameter.Optional
    });

config.Routes.MapHttpRoute(
    name: "PersonProfession Put",
    routeTemplate: "api/personprofession/save/",
    defaults: new { controller = "PersonProfession", action = "Put" }
);

【问题讨论】:

  • 两个控制器都继承自 ApiController 吗?
  • 看起来不错,能不能给我们看看PersonProfessionController的所有代码?
  • 是的。其他方法可用/可见就好了。
  • @MarcoTalento:已更新。
  • 我真的不明白为什么人们坚持使用 MapHttpRoute...尝试使用 Route 属性更容易和更清洁。 asp.net/web-api/overview/web-api-routing-and-actions/…

标签: c# .net asp.net-mvc asp.net-web-api2


【解决方案1】:

找到了!这不起作用:

[HttpPut]
[AcceptVerbs("PUT")]
[Route("api/personprofession/save/")]
public void Put([FromBody]PersonProfessionModel value)

这确实有效:

[HttpPut]
[Route("api/personprofession/save/")]
public void Put([FromBody]PersonProfessionModel value)

所以显然你不应该添加[AcceptVerbs("PUT")]

它背后的为什么让我感到困惑,但是你去吧。

【讨论】:

  • AFAIK AcceptVerbs 是一个较旧的实现,因此被 HttpPut 取代。从技术上讲,同时使用两者是多余的,但可能会导致内部错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-04
  • 1970-01-01
  • 1970-01-01
  • 2013-04-19
  • 1970-01-01
  • 2012-08-08
相关资源
最近更新 更多