【问题标题】:Web API 2 Error 401.0 with IIS8.5 on one MapHttpRoute一个 MapHttpRoute 上带有 IIS8.5 的 Web API 2 错误 401.0
【发布时间】:2015-07-07 00:07:49
【问题描述】:

我正在制作一个 Web API 2。

在我的本地机器上调试工作正常。 VS 2013 + IIS 8.0
服务器正在运行 Windows 2012 R2 + IIS 8.5 + Plesk v12

当我在本地机器上调试时,我的所有路由都可以正常工作。
我正在使用 Postman 和 Fiddler 检查 API 上的所有内容。
我有一个例外,当我将它部署到服务器并发送 PUT 请求以路由 http://example.net/service/Member/Profile/9
我收到以下错误:

HTTP 错误 401.0 - 未经授权 您无权查看 这个目录或页面。

最可能的原因:经过身份验证的用户无权访问 处理请求所需的资源。

模块:WebDAVModule

通知:ExecuteRequestHandler

处理程序:WebDAVStaticMapping

错误代码:0x80070005

请求的网址:http://example.org/service/Member/Profile/5

物理路径:C:\Inetpub\vhosts\example.org\httpdocs\service\Member\Profile\5

登录方式:匿名

登录用户:匿名

我检查了 IIS 上的配置,我认为它看起来不错。 匿名身份验证处于活动状态,而其他身份验证方法已停用。已选择 ApplicationPoolIdentity。

Web API 2 背后的代码

路线是这样映射的:

config.Routes.MapHttpRoute(
            name: "EditMember",
            routeTemplate: "service/Member/Profile/{id}",
            defaults: new { controller = "Members", action = "Update", id = RouteParameter.Optional },
            constraints: null
        );

它将在控制器中运行此代码:

// PUT: service/Member/5
[ActionName("Update")]
[ResponseType(typeof(void))]
public async Task<IHttpActionResult> PutMembers(int id, MemberUpdate member)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }
    IEnumerable<Members> memberSearchExist = from search in db.MembersSet
                                             where search.Id == id 
                                             select search;
    if (!memberSearchExist.Any())
    {
        return Conflict();
    }
    try
    {
        Members memberChanged = memberSearchExist.FirstOrDefault();
        memberChanged.Firstname = member.Firstname;
        memberChanged.Lastname = member.Lastname;
        memberChanged.DateOfBirth = member.DateOfBirth;
        memberChanged.Email = member.Email;

        db.Entry(memberChanged).State = System.Data.Entity.EntityState.Modified;

        await db.SaveChangesAsync();
    }
    catch (DbUpdateConcurrencyException)
    {
        if (!MembersExists(id))
        {
            return NotFound();
        }
        else
        {
            throw;
        }
    }
    return StatusCode(HttpStatusCode.NoContent);
}

我正在使用 CORS,它适用于所有其他事情。

var corsAttr = new EnableCorsAttribute("http://app.example.org, http://localhost:14844", "*", "*");
config.EnableCors(corsAttr);

有人可以帮帮我吗?

提前致谢!

【问题讨论】:

    标签: c# asp.net iis asp.net-web-api2 iis-8.5


    【解决方案1】:

    第一个问题是 WebDav 模块。该模块正在阻止 PUT 和 DELETE 方法。您可以通过卸载它来解决此问题。你可以在这里找到如何做到这一点:https://betimdrenica.wordpress.com/2013/02/05/web-api-on-iis-8-0-405-method-not-allowed-for-put/

    第二个问题是 HTTP 错误 404.0 - Not Found, MapRequestHandler 我在 SO 上找到了这个解决方案:https://stackoverflow.com/a/5677618/2660428 我按照这个步骤安装了服务器端包含 http://www.iis.net/configreference/system.webserver/serversideinclude

    最后一个问题是我只能

    var corsAttr = new EnableCorsAttribute("http://app.example.org", "*", "*");
    config.EnableCors(corsAttr);
    

    现在一切正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-10
      • 1970-01-01
      • 2018-02-05
      • 2019-01-29
      • 1970-01-01
      • 2016-02-02
      • 1970-01-01
      相关资源
      最近更新 更多