【问题标题】:Web API 404 error Delete requestWeb API 404 错误删除请求
【发布时间】:2017-07-12 10:04:14
【问题描述】:

我有一个 Web API,可以完美地用于开发各种 HTTP 请求(在同一个控制器上),一旦我将它移到生产环境(共享服务器,我什至无权访问它)DELETE请求停止工作(其他工作正常),我收到 404 错误:

请求 URL https://www.example.com:443/Rejected-By-UrlScan~/API/Users/DeleteUser/1

物理路径 d:\xx\yy\example.com\Rejected-By-UrlScan

匿名登录方法

匿名登录用户

这是 web.config 的(一部分):

 <system.web>
    <customErrors mode="Off"/>
    <authentication mode="None" />
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" />
  </system.web>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <remove name="WebDAVModule" />
    </modules>
    <handlers>
      <remove name="WebDAV" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
  </system.webServer>

删除操作:

[Authorize]
[RoutePrefix("Users")]
public class UsersController : ApiController
    {
    [HttpDelete]
    [Route("DeleteUser/{id:int}")]
    public void Delete(int id)
    {
        _UsersRepository.Delete(id);
    }

还有 AJAX 调用:

deleteUser = function (id, callback) {
    $.ajax({
        url: "../API/Users/DeleteUser/" + id,
        type: "DELETE",
        success: function () {
            callback;
        }
    });
}

WebApiConfig.cs:

    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
        // Configure Web API to use only bearer token authentication.
        config.SuppressDefaultHostAuthentication();
        config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

        // Web API routes
        config.MapHttpAttributeRoutes();


        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        //create json formatter and remove all others
        var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
        jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
        jsonFormatter.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;
        config.Formatters.Remove(config.Formatters.FormUrlEncodedFormatter);
        config.Formatters.Remove(config.Formatters.XmlFormatter);
    }

在同一控制器上的工作调用示例:

getUsers = function (callback) {
    $.get("../API/Users/GetUsers/", callback);
}

还有行动:

[Route("GetUsers")]
public IEnumerable<User> GetUsers()
{
    return _UsersRepository.GetUsers();
}

【问题讨论】:

  • 虽然UsersController[Authorize],为什么你却匿名访问?它与 404 问题关系不大,但很奇怪。
  • @Youngjae 我正在使用bearer token,我看到它在我的标题中正确设置,不知道为什么它有“匿名”。我认为404错误是因为@987654332 @ 导致 url 改变,但我不知道该怎么做,你知道吗?
  • 我不知道,但最好也发布您的WebApiConfig.csStartup.cs
  • @Youngjae 我发了,谢谢。

标签: asp.net-web-api


【解决方案1】:

在您的 IIS 中,您是否配置了 URLScan 扩展?

https://www.iis.net/downloads/microsoft/urlscan

UrlScan 是一种安全工具,它限制 IIS 将处理的 HTTP 请求的类型

您的 URL 中的“Rejected-By-UrlScan”表明扩展程序可能配置为拒绝“删除”请求。

您可以询问托管 IIS 的服务器管理员是否将删除请求配置为在 IIS 中允许。

【讨论】:

  • 就我而言,这很有效。我刚刚使用 Windows 控制面板卸载了“Microsoft UrlScan Filter”。
【解决方案2】:

JS sn-p 中的 URL 错误。应该是

deleteUser = function (id, callback) {
    $.ajax({
        url: "[Application_Path]/Users/DeleteUser/" + id,
        type: "DELETE",
        success: function () {
            callback;
        }
    });
}

[RoutePrefix("Users")] overrides the default routing, so there should be no "API" in the URL.

您应该删除 [Application_Path] 并输入您的虚拟目录名称或使用 @Url.Action

【讨论】:

  • 如果它调用相同的动作和相同的控制器,请发布其他调用的代码。
  • 您不应在 URL 中使用“../../”,使您的 URL 相对于当前页面或绝对。我猜它可能与 get 用户一起工作,因为你有 2 个级别,所以它跳过了 API 字,但是在删除用户中,只有一个“../”,所以它仍然可以访问其中的 URL wit API。
  • 对不起,我错了,他们都有一个../
  • 在这种情况下,请检查浏览器中的流量并检查两种情况下调用的完整 URL 是什么。您可以在开发和生产中检查这一点
  • 我看到DELETE请求的url是错误的,因为Rejected-By-UrlScan~
【解决方案3】:

我必须让它工作,所以我将请求的类型从 DELETE 更改为 POST 并且它运行良好:

[Authorize]
[RoutePrefix("Users")]
public class UsersController : ApiController
    {
    [HttpPost]
    [Route("DeleteUser/{id:int}")]
    public void Delete(int id)
    {
        _UsersRepository.Delete(id);
    }

deleteUser = function (id, callback) {
    $.ajax({
        url: "../API/Users/DeleteUser/" + id,
        type: "POST",
        success: function () {
            callback;
        }
    });
}

【讨论】:

  • 这实际上并没有回答问题,而是完全忽略了它。
猜你喜欢
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
  • 2019-12-06
  • 1970-01-01
  • 2016-05-24
  • 2020-11-13
  • 2013-05-24
  • 1970-01-01
相关资源
最近更新 更多