只是好奇。我正在网上看一个网络项目。
代码流如下:
[RoutePrefix("/person")]
public class PersonController : ApiController
{
//....
[Route("/register")]
public IHttpACtionResult RegisterPerson(PersonDto personDto)
{
//....
}
//....
}
您是否注意到上述代码?没有指定[HttpGet()]
或[HttpPost()]
。但上述代码无法进行GET
通话,但适用于POST
通话。
有关此方法的HTTP-Verb如何解决的任何想法?
注意:我知道如果方法名称以GET
或POST
开头,则相应地通过HTTPGet
或HTTPPost
调用该方法。但方法名称以Register...
开头。
任何想法如何运作?
答案 0 :(得分:4)
如果方法名称与任何HTTPVerb都不匹配,则默认为[HTTPPost]。
动作选择通过ReflectedHttpActionDescriptor类的GetSupportedHttpMethods()进行。
if (supportedHttpMethods.Count == 0)
{
// Use POST as the default HttpMethod
supportedHttpMethods.Add(HttpMethod.Post);
}
答案 1 :(得分:3)
因为您的方法(RegisterPerson)有一个参数(PersonDto)......它必须“发布”某些内容,否则您将无法访问水合dto对象。
虽然这是关于WCF的,但是一个段落有点亮......特别是关于GET的性质
https://msdn.microsoft.com/en-us/library/bb628610(v=vs.110).aspx
ASP.NET AJAX支持使用HTTP POST和HTTP GET谓词的操作,HTTP POST是默认操作。创建没有副作用的操作并返回很少或从不更改的数据时,请改用HTTP GET。 可以缓存GET操作的结果,这意味着对同一操作的多次调用可能只会导致一个服务请求。缓存不是由WCF完成的,而是可以在任何级别进行(在用户的浏览器,代理服务器和其他级别。)如果要提高服务性能,缓存是有利的,但如果数据频繁更改或操作执行某些操作,则可能无法接受。
答案 2 :(得分:2)
在您的示例中,Web API将使用媒体类型格式化程序从请求正文中读取PersonDto
的值,如果它来自URL,那么它是GET您可以明确地通过 [FromBody]
或 [FromUri]
强制WebApi使用其中一个:
public HttpResponseMessage GetSample([FromUri] SomeObject foo) { ... }
或
public HttpResponseMessage PostSample([FromBody] SomeObject foo) { ... }
默认情况下,Web API首先查看路由URL([Route])数据并尝试将其与路由匹配,如果它无法从请求URI获取值,并且当参数是复杂类型时可能会发生这种情况Web API使用媒体类型格式化程序从请求正文中读取值。
答案 3 :(得分:2)
如果它与Http Verb中的任何一个匹配,则取决于你的动作名称。例如
在我的API中,我使用了一个Action获取供应商列表,现在看看它是如何工作的:
[Route("Get")]
public IHttpActionResult GetVendor()
{
var vendor = _ivs.GetVendorDetails();
return Ok(vendor);
}
现在,当我使用HttpPost击中api时,我收到以下消息:
{ "消息":"请求的资源不支持http方法' POST'。" }
但是,如果我使用HttpGet命中API,我将获取数据
{
"VendorId": "cc0e7ea1-4751-467b-b60b-be9b5202a511",
"VendorCode": "Vend1",
"VendorName": "testvendor",
"AddressLine1": "AddressLine1",
"AddressLine2": "AddressLine2",
"AddressLine3": "AddressLine3",
"City": "City ",
"PINCode": "12345 ",
"province": "province ",
"Phone1": "Phone1",
"Phone2": "Phone2",
"Phone3": "Phone3",
"PrimaryPhone": "Phone3 ",
"CreatedDate": "2017-06-21T15:49:30.207",
"CreatedBy": "e465e3e2-4156-434e-a444-f9a9626e1cf6",
"UpdatedDate": "1900-01-01T00:00:00",
"UpdatedBy": null,
"IsActive": true
}
现在我正在更改方法名称
[Route("Get")]
public IHttpActionResult Vendor()
{
var vendor = _ivs.GetVendorDetails();
return Ok(vendor);
}
并使用HttpGet
命中API我现在的回应是:
{"消息":"请求的资源不支持http方法' GET'。" }