【问题标题】:HTTP405: BAD METHOD - (XHR)Put :: Only on serverHTTP405: BAD METHOD - (XHR)Put :: 仅在服务器上
【发布时间】:2020-12-15 14:10:16
【问题描述】:

背景:使用 Angular,.net Core 2.2。使用 Windows 身份验证。

尝试在服务器上发出任何 put 请求时,我在服务器上收到“HTTP405:错误方法 - 不支持使用的 HTTP 动词”(在本地工作正常)。有谁知道为什么?我在控制器级别将请求声明为 HttpPut 时似乎找不到问题,是否需要在 IIS 上设置一些配置?

我的 web api 控制器设置为:

namespace appSchool.APIs
{
[Authorize]
[Route("api/engagements")]
public class EngagementController : ControllerBase
{

    EngagementProvider _engagementProvider;
    ILogger _logger;

    public EngagementController(EngagementProvider engagementProvider, ILogger<EngagementController> logger)
    {
        _logger = logger;
        _engagementProvider = engagementProvider;
    }
    [HttpGet]
    public async Task<ActionResult> Get()
    {
        try
        {
            var engs = await _engagementProvider.GetEngagementsAsync();
            var dtoEngs = Engagement.MapForDto(engs);
            return Ok(dtoEngs);
        }
        catch (Exception exp)
        {
            _logger.LogError(exp.Message);
            return StatusCode(500, exp);
        }
    }
    [HttpPost]
    [Authorize]
    public async Task<ActionResult> Post([FromBody]Engagement eng)
    {
        try
        {
            var newEng = await _engagementProvider.InsertEngagementAsync(eng);
            if (newEng == null)
            {
                return StatusCode(500, "Unable to insert engagement");
            }
            return Ok(newEng);
        }
        catch (Exception exp)
        {
            _logger.LogError(exp.Message);
            return StatusCode(500, exp);
        }
    }
    [HttpPut]
    [Authorize]
    public async Task<ActionResult> Put([FromBody]Engagement eng)
    {
        try
        {
            var updEng = await _engagementProvider.UpdateEngagementAsync(eng);
            if (updEng == null)
            {
                return StatusCode(500);
            }
            return Ok(updEng);
        }
        catch (Exception exp)
        {
            _logger.LogError(exp.Message);
            return StatusCode(500, exp);
        }
    }

我对角度服务的要求是

updateEngagement(updatedEngagement: Engagement) : Observable<Engagement> {
    return this.http.put<Engagement>(this.engagementUrl, updatedEngagement);
}

【问题讨论】:

  • 您的 IIS 上是否安装了 WebDAV 模块?如果您有权访问您的服务器,您可以在 IIS 上执行失败的请求跟踪。请参阅此处以了解如何做到这一点 - stackify.com/beyond-iis-logs-find-failed-iis-asp-net-requests
  • 当您的代码返回 500 时,为什么会得到 405?看来它没有进入您的代码。编码每一项都有效吗?如果是这样,它最后一次起作用是什么时候?它是否适用于其他帖子。
  • @jdweng - 405 是客户端错误,意味着端点本身没有被命中。只有在端点发生实际执行并且端点中的处理出错时,您才会得到 500。
  • 没错,它没有击中服务器或500。而是之前失败并给出了405错误的方法。
  • Put 在本地工作正常,而 post/get 在服务器上工作正常。对于 put 方法,它在服务器上根本不起作用

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


【解决方案1】:

我发现了这个问题。 IIS 默认禁用服务器上的 PUT 请求。我必须修改 web 配置以允许 put 请求进入。

<system.webServer>
<handlers>
  <remove name="WebDAV" />
  <remove name="ExtensionlessUrl-Integrated-4.0" />
  <add name="ExtensionlessUrl-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,DELETE,PUT" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
  <remove name="aspNetCore" />
  <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
</handlers>
<modules>
  <remove name="WebDAVModule" />
</modules>

【讨论】:

    猜你喜欢
    • 2022-02-09
    • 2012-04-23
    • 2021-12-20
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多