Web API POST数据,错误HTTP错误405.0 - 方法不允许

时间:2017-09-08 00:50:32

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

我正在编写一个Web API来接收遥测数据。十六进制字符串形式的遥测数据应该是对Web API URL的POST。此Web API不需要身份验证,没有RoutePrefix,也没有Route。 Content-Type: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中配置 - &gt;动词选择了所有动词。

我的实施和网站配置有什么问题?

2 个答案:

答案 0 :(得分:0)

我纠正了问题,这可能不是完美的方式。只需将我的解决方案放在这里,万一有人可能或多或少受益。

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

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

答案 1 :(得分:0)

您可以在控制器或操作上使用[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