Контроллер 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;
}
}
}
}