Ошибка веб-API 2 401.0 с IIS8.5 на одном MapHttpRoute

Я делаю веб-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

Запрашиваемый URL-адрес: http://example.org/service/Member/Profile/5.

Физический путь: C:\Inetpub\vhosts\example.org\httpdocs\service\Member\Profile\5

Способ входа: Анонимный

Пользователь входа в систему: анонимный

Я проверил конфигурацию в IIS, и я думаю, что все в порядке. Анонимная аутентификация активна, а другие методы аутентификации деактивированы. Выбирается ApplicationPoolIdentity.

Код веб-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);

Может ли кто-нибудь помочь мне, пожалуйста?

Заранее спасибо!


person Bernd Verhofstadt    schedule 28.04.2015    source источник


Ответы (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. Я нашел это решение: https://stackoverflow.com/a/5677618/2660428 на SO И я выполнил этот шаг, чтобы установить серверную часть, включающую http://www.iis.net/configreference/system.webserver/serversideinclude

Последняя проблема заключалась в том, что я мог только

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

Теперь все работает нормально.

person Bernd Verhofstadt    schedule 12.05.2015