WebApi 中的默认 HTTP 动词是什么?获取或发布

本文关键字:获取 是什么 默认 HTTP WebApi | 更新日期: 2023-09-27 18:37:26

只是古玩。我正在互联网上查看其中一个网络项目。

代码流是这样的:

[RoutePrefix("/person")]
public class PersonController : ApiController
{
    //....
    [Route("/register")]
    public IHttpACtionResult RegisterPerson(PersonDto personDto)
    {
        //....
    }
    //....
}

你注意到上面的代码了吗?没有指定[HttpGet()][HttpPost()]。然而,上面的代码对于GET调用失败,但适用于POST调用。

任何想法如何解决此方法的HTTP动词?

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

知道这是如何工作的吗?

WebApi 中的默认 HTTP 动词是什么?获取或发布

如果方法名称与任何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);
            }

这取决于您的操作名称,如果它与 http 动词上的任何操作名称匹配。例如

在我的 API 中,我使用了一个操作来获取供应商列表,现在看看它是如何工作的:

    [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'。

因为你的方法有一个参数(PersonDto)(RegisterPerson)...它必须"发布"某些内容,否则您将无法访问水合的 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 完成的,但可以在任何级别(在用户的浏览器中、代理服务器和其他级别)进行。如果要提高服务性能,则缓存是有利的,但如果数据频繁更改或操作执行某些操作,则可能无法接受缓存。

在您的示例中,Web API 将使用媒体类型格式化程序从请求正文中读取 POST 的PersonDto值,即 POST,如果它来自 URL,它是 GET,您可以使用[FromBody][FromUri]显式强制 WebApi 使用其中一个,如下所示:

public HttpResponseMessage GetSample([FromUri] SomeObject foo) { ... }

 public HttpResponseMessage PostSample([FromBody] SomeObject foo) { ... }

默认情况下,Web API 首先查看路由 URL ([Route]) 数据,如果无法从请求 URI 获取值,则尝试将其与路由匹配,当参数是复杂类型 Web API 使用媒体类型格式化程序从请求正文读取值时,可能会发生这种情况。