Контроллер MVC4 (Web API) в SharePoint 2007 Ошибка виртуального каталога: доступ запрещен

У меня есть приложение ASP.NET 4, которое у меня есть в виртуальном каталоге на моем сайте SharePoint. Это отдельное приложение в собственном пуле приложений, так что я не думаю, что SP - это проблема, но? Страница aspx работает нормально, но запрос к ApiController возвращает 401 Ошибка: Access is Deniend.

<html><head><title>Error</title></head><body>Error: Access is Denied.</body></html>

Просмотр событий не имеет ничего, и журнал IIS показывает 401 2 2148074254, затем 401 1 0, затем 200 0 0, затем 401 1 2148074248. Я знаю, что последний 401.1 выглядит как моя ошибка, но я неоднократно подтверждал, что это последняя запись в журнале для запроса. Консистентный в IE8, Chrome, FireFox.

Fiddler показывает только 401, "WWW-Authenticate: NTLM", чередующийся с "WWW-Authenticate: NTLM TlRMblah_blah_blah..." и HTML выше.

План резервного копирования состоит в том, чтобы отказаться от контроллера и использовать.ashx, но, надеюсь, ТАК может помочь.

1 ответ

Решение

Нашли обходной путь до тех пор, пока проект не перестал работать в SharePoint. Сохранял класс Controler (PSSController) как есть, но добавил файл Ashx с приведенным ниже кодом и изменил JavaScript, чтобы использовать его. cntrl - просто мой класс; ваши параметры QueryString и Post будут отличаться. Немного бестолково, но это работает:)

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.SessionState;
using Newtonsoft.Json;

namespace PipWebApp
{
    public partial class PSSurvey2API : IHttpHandler, IRequiresSessionState
    {
        public void ProcessRequest(HttpContext context)
        {
            String InputString = null;
            using (var sr = new System.IO.StreamReader(context.Request.InputStream))
                InputString = sr.ReadToEnd();
            List<PSSurvey.cntrl> cntrls = (List<PSSurvey.cntrl>)JsonConvert.DeserializeObject(InputString, typeof(List<PSSurvey.cntrl>));
            String Params = context.Request.QueryString["Params"];


        Controllers.PSSController APICon = new Controllers.PSSController();

        if (context.Request.QueryString["Rpt"] == null)
            context.Response.Write(JsonConvert.SerializeObject(APICon.Post(cntrls, Params)));
        else
            context.Response.Write(JsonConvert.SerializeObject(APICon.Post(cntrls, context.Request.QueryString["Rpt"], Params)));
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

}

Другие вопросы по тегам