401 Несанкционированный пост .ajax - PullRequest
1 голос
/ 21 октября 2011

Я получаю 401 Unauthorized, когда мой ajax выполняет событие POST, это только тогда, когда проект выполняется через sitecore. Это все работает как талисман, мне нужно обойтись для sitecore, это мои текущие настройки.

Я перешел по ссылке 1, чтобы настроить свой код, поэтому у меня есть следующее:

MasterLayout.aspx:

<script src="jsfile.js" type="text/javascript"></script>

<script src="../../../content/javascript/jquery-1.6.2.min.js"></script>

MasterLayout.aspx.cs:

using System.Web.Services;

[WebMethod]
public static string GetDate()
{
   return DateTime.Now.ToString();
}

MyCharts.ascx

<div class="Result" id="Result">Click here for the time.</div>

jsfile.js:

$(document).ready(function() {
// Add the page method call as an onclick handler for the div.

    $('.Result').click(function() {
        $.ajax({
            type: "POST",
            url: "MyCharts.aspx/GetDate", // MyCharts.aspx is a logical page created in sitecore physically it loads MasterLayout with MyCharts within that.
            data: "{}",
            contentType: "application/json",
            dataType: "json",
            success: function(msg) {
                // Replace the div's content with the page method's return.
                $(".Result").text(msg.d);
            }
        });
    });
});

При отладке javascript пытается POST HelloWorld, и я получаю:

"Message":"Authenticationfailed.","StackTrace":null,"ExceptionType":"System.InvalidOperationException"

Ссылка 1: http://encosia.com/using-jquery-to-directly-call-aspnet-ajax-page-methods/

Смежный вопрос: Получение ошибки «401 Unauthorized» в соответствии с вызовом jquery для webmethod

Мой связанный вопрос: https://stackoverflow.com/questions/7837532/get-my-html-and-javascript-to-perform-postback-ajax-call

Ответы [ 3 ]

3 голосов
/ 22 октября 2011

Если эта страница размещена в решении Sitecore, что, по-видимому, и есть, запрос страницы, вероятно, проходит через контекст Sitecore.Вы можете отредактировать web.config, чтобы эта страница не проходила через контекст Sitecore.Существует настройка с именем IgnoreUrlPrefixes:

<!--  IGNORE URLS
  Set IgnoreUrlPrefixes to a '|' separated list of url prefixes that should not be
  regarded and processed as friendly urls (ie. forms etc.)
-->
<setting name="IgnoreUrlPrefixes" value="{Pipe-delimited list}" />

. Вы можете обновить этот список, включив в него путь к вашей специальной странице.

2 голосов
/ 21 октября 2011

Несколько придирок, которые могут подтолкнуть вас к решению:

  1. Вам не нужно включать свойство «Данные», если вы не передаете какие-либо данные
  2. Вы используете "POST", но не публикуете никаких данных - вместо этого используйте "GET"
  3. Вы говорите, что ваши contentType и dataTypes - JSON, но веб-метод возвращает строку

Post / get может решить проблему - Get намного слабее с безопасностью, чем Post.

Может также помочь добавить функцию обратного вызова с ошибкой, чтобы узнать, есть ли какая-либо дополнительная информация о том, почему запростерпит неудачу.

1 голос
/ 24 октября 2011

Мне нужно решение, которое позволило бы мне запускать страницу, на которой я делал публикацию, в контексте sitecores.Если вы не против страницы, игнорирующей контекст, посмотрите на ответ Марка Урсино, он будет работать как шарм.

Мой ответ делает следующее:

Javascript:

function MySuperCoolFunction() {
    strUser1 = document.getElementById("Symbol1").innerHTML;
    strUser2 = document.getElementById("Symbol2").innerHTML;

    var join = strUser1 + "," + strUser2;

    __doPostBack('upCurrencyCharts', join);
}

.ascx / .aspx:

<asp:UpdatePanel runat="server" ID="upCurrencyCharts" OnLoad="upCurrencyCharts_onload">
    <ContentTemplate>

           // My Content Here  

     </ContentTemplate> 
 </asp:UpdatePanel> 

.cs:

protected void upCurrencyCharts_onload(object sender, EventArgs e)
{
    string item1 = null;
    string item2 = null;

    if (IsPostBack)
    {      
       string items = Request["__EVENTARGUMENT"];
       string[] partsArray = items.Split(',');

            for (int i = 0; i < partsArray.Length; i++)
            {
                if (i == 0)
                {
                    item1 = partsArray[i];
                }

                if (i == 1)
                {
                    item2 = partsArray[i];
                }
            }
        }

        // do something with item1 and 2 here.. in mycase feed to database.

Javascript вызывает событие обратной передачи на панели обновлений и анализирует строку параметров, через которую я отправляюна бэкэнд моего сайта.Событие Onload срабатывает при обратной передаче и запускает все, что я делаю в моем событии onload, в этом случае помещает элементы в массив, чтобы разделить их, а затем помещает их в базу данных.Simples.Спасибо всем за помощь в этом.: D

...