Put 方法不可用(或在帮助中可见)
Put method not available (or visible in Help)
我有一个具有以下 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 class:
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" }
);
找到了!这不起作用:
[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")]
。
它背后的原因让我很困惑,但你看吧。
我有一个具有以下 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 class:
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" }
);
找到了!这不起作用:
[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")]
。
它背后的原因让我很困惑,但你看吧。