【问题标题】:Web API POST data with error HTTP Error 405.0 - Method Not AllowedWeb API POST 数据错误 HTTP 错误 405.0 - 方法不允许
【发布时间】:2018-02-16 19:46:08
【问题描述】:

我正在编写一个 Web API 来接收遥测数据。十六进制字符串形式的遥测数据应 POST 到 Web API URL。此 Web API 不需要身份验证、RoutePrefix 和 Route。内容类型:text/plain

这是我的代码。

[Route("")]
[EnableCors(origins: "*", headers: "*", methods: "*")]
public class MyData_Controller : ApiController
{
    [HttpPost]
    [ActionName("DefaultAction")]
    public Task<IHttpActionResult> DataPost(String myData)
    {
        SaveData(myData);
        return Task.FromResult<IHttpActionResult>(Json(true));
    }

    protected void SaveData(String myData)
    {
    }
}

然后我将此 WebAPI 托管到 IIS8.5。在 web.config 中,我还添加了以下内容

  <system.webServer>
    <handlers accessPolicy="Read, Execute, Script">
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
      <remove name="WebDAV" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." 
        verb="GET,HEAD,POST,PUT"
        type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Execute" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
    <modules runAllManagedModulesForAllRequests="true">
      <remove name="WebDAVModule" />
    </modules>
  </system.webServer>  

当我在 Postman 中使用 POST 对其进行测试时,出现以下错误

HTTP Error 405.0 - Method Not Allowed
The page you are looking for cannot be displayed because an invalid method (HTTP verb) is being used.

Detailed Error Information:
Module     DirectoryListingModule
Notification       ExecuteRequestHandler
Handler    StaticFile
Error Code     0x80070001
Requested URL      http://MyDataServer.com:2331/
Physical Path      E:\Applications\Web API\MyDataServer_WebAPI
Logon Method       Anonymous
Logon User     Anonymous

邮递员标题显示

Allow → GET, HEAD, OPTIONS, TRACE

是否表示动词 POST 或 PUT 未启用?

我检查了 StaticFile 处理程序,它在 Handler Mappings 和 Requested Restrictions 中进行了配置 -> Verbs 选择了所有动词。

我的实现和站点配置有什么问题?

【问题讨论】:

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


    【解决方案1】:

    您可以在控制器或操作上使用[AllowAnonymous] 来避免伪造身份验证。

    您可以将[Route] 设置为根,因为您正在使用属性路由,这样在为您的 API 设计 URI 时可以提供更多控制和更大的灵活性。

    因为它是一个 Web API,您可以简单地使用 HTTP 状态代码来提供来自请求的反馈。

    如果遥测数据仅通过请求正文发送,则应使用[FromBody] 参数绑定属性对其进行限制。

    [Route("/", Name = "DefaultTelemetry")]
    [EnableCors(origins: "*", headers: "*", methods: "*")]
    public class MyData_Controller : ApiController {
        [HttpPost]
        [AllowAnonymous]
        [ActionName("DefaultAction")]
        [Route("")] //Matches POST / <-- site root
        public async Task<IHttpActionResult> Post([FromBody]String data) {
            var saved = await SaveData(data);
            return saved ? Ok() : BadRequest();
        }
    
        protected Task<bool> SaveData(String data) {
            //...implementation
        }
    }
    

    参考Attribute Routing in ASP.NET Web API 2

    【讨论】:

      【解决方案2】:

      我想解决这个问题,这可能不是完美的方法。只需将我的解决方案放在这里,以防有人或多或少地受益。

      如果我将身份验证属性放在处理程序和身份验证类中,始终返回 true(给出假身份验证成功),那么 API 可以正常工作而不会出现 405 错误。我觉得这不是正确的方法,但真的没有时间进一步挖掘。

      另一个问题是定义路由。如果没有提供路由,则将此控制器设置为路由配置部分中的默认控制器。

      【讨论】:

      • 您可以在控制器或操作上使用[AllowAnonymous] 来避免伪造身份验证。
      猜你喜欢
      • 2012-08-26
      • 2012-06-29
      • 2016-06-27
      • 1970-01-01
      • 2022-02-09
      • 2016-03-05
      • 1970-01-01
      • 2015-06-13
      • 1970-01-01
      相关资源
      最近更新 更多