Я создаю небольшое приложение в MVC 4.5. У меня есть база данных Azure, и я сначала использую код с инфраструктурой Entity, чтобы настроить ее. Приложение размещено в моей области sharepoint.
Домашний контроллер Index()
Действие имеет [SharePointContextFilter]
и загружает, помимо прочего, имя пользователя зарегистрированного пользователя. Когда приложение отлаживается и выполняется это первое действие, Sharepoint {StandardTokens}
присоединяется к URL-адресу, поэтому <SPHostUrl
и AppWebUrl
и несколько других переменных добавляются в строку запроса.
Если я перейду к действию без [SharePointContextFilter]
, он отлично работает, пока я не вернусь к действию с помощью [SharePointContextFilter]
. Затем я получаю сообщение об ошибке:
Unknown User
Unable to determine your identity. Please try again by launching the app installed on your site.
Я предполагаю, что это связано с тем, что некоторые из Sharepoint {StandardTokens}
отсутствуют, потому что если я вручную добавлю их к ссылке, например:
@Url.Action("Index", "Home", new { SPHostUrl = SharePointContext.GetSPHostUrl(HttpContext.Current.Request).AbsoluteUri })
и отметьте другое действие с помощью [SharePointContextFilter]
, оно все равно работает.
Похоже, это кажется ненужным сложным способом решения этой проблемы. Я не хочу отмечать каждое действие в своем приложении с помощью [SharePointContextFilter]
и вручную вставлять {StandardTokens}
в строку запроса для каждой создаваемой ссылки. Нельзя ли сохранить эту информацию в сеансе или в файле cookie каким-то образом, поэтому мне не нужно это делать?
Для справки, вот какой-то код:
HomeController.Index(), первое действие, которое выполняется.
[SharePointContextFilter]
public ActionResult Index()
{
User spUser = null;
var spContext = SharePointContextProvider.Current.GetSharePointContext(HttpContext);
using (var clientContext = spContext.CreateUserClientContextForSPHost())
{
if (clientContext != null)
{
spUser = clientContext.Web.CurrentUser;
clientContext.Load(spUser, user => user.Title);
clientContext.ExecuteQuery();
ViewBag.UserName = spUser.Title;
}
}
return View();
}
Вот атрибут [SharePointContextFilter]
(созданный визуальной студией):
/// <summary>
/// SharePoint action filter attribute.
/// </summary>
public class SharePointContextFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
SharePointContext currentContext = SharePointContextProvider.Current.GetSharePointContext(filterContext.HttpContext);
Uri redirectUrl;
switch (SharePointContextProvider.CheckRedirectionStatus(filterContext.HttpContext, out redirectUrl))
{
case RedirectionStatus.Ok:
return;
case RedirectionStatus.ShouldRedirect:
filterContext.Result = new RedirectResult(redirectUrl.AbsoluteUri);
break;
case RedirectionStatus.CanNotRedirect:
filterContext.Result = new ViewResult { ViewName = "Error" };
break;
}
}
}
Ссылки, которые я использую. Из файла _Layout.cshtml.:
<li id="Home"><a href="@Url.Action("Index", "Home", new { SPHostUrl = SharePointContext.GetSPHostUrl(HttpContext.Current.Request).AbsoluteUri })">Home</a></li>
<li id="Contract"><a href="@Url.Action("Index", "Contract", new { SPHostUrl = SharePointContext.GetSPHostUrl(HttpContext.Current.Request).AbsoluteUri })">Avrop</a></li>
Если я попытаюсь использовать эти ссылки из действия, которое не отмечено фильтром [SharePointContextFilter]
, SPHostUrl
не найден. Если я попытаюсь ссылаться на действие, которое помечено фильтром [SharePointContextFilter]
, я получаю вышеупомянутую ошибку, если SPHostUrl
не включен.
В основном это создает ситуацию, когда я могу перейти от фильтрованных действий, но потом я никогда не смогу вернуться к ним.
Надеюсь, это было достаточно ясно.