WebApi中的默认HTTP谓词是什么? GET或POST?

时间:2016-03-04 13:48:13

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

只是好奇。我正在网上看一个网络项目。

代码流如下:

[RoutePrefix("/person")]
public class PersonController : ApiController
{

    //....
    [Route("/register")]
    public IHttpACtionResult RegisterPerson(PersonDto personDto)
    {
        //....
    }
    //....
}

您是否注意到上述代码?没有指定[HttpGet()][HttpPost()]。但上述代码无法进行GET通话,但适用于POST通话。

有关此方法的HTTP-Verb如何解决的任何想法?

注意:我知道如果方法名称以GETPOST开头,则相应地通过HTTPGetHTTPPost调用该方法。但方法名称以Register...开头。

任何想法如何运作?

4 个答案:

答案 0 :(得分:4)

如果方法名称与任何HTTPVerb都不匹配,则默认为[HTTPPost]。

动作选择通过ReflectedHttpActionDescriptor类的GetSupportedHttpMethods()进行。

请参阅以下链接中的代码: https://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Http/Controllers/ReflectedHttpActionDescriptor.cs

 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'。" }