2011-10-21 39 views
1

我得到一個401未經授權,當我的ajax正在做一個POST事件時,這隻有當項目正在通過sitecore運行時。這一切都像一個魅力,我需要爲sitecore工作這是我目前的設置。401未經授權.ajax文章

我跟着鏈接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.as CX

<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嘗試開機自檢的HelloWorld,我得到:

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

鏈接1:http://encosia.com/using-jquery-to-directly-call-aspnet-ajax-page-methods/

回覆遲來問:Getting "401 Unauthorized" error consistently with jquery call to webmethod

我的相關問題:https://stackoverflow.com/questions/7837532/get-my-html-and-javascript-to-perform-postback-ajax-call

+0

「HelloWorld」WebMethod確實存在嗎?我知道這會導致404不是401,但是你的帖子並不是很清楚你想調用哪個'WebMethod' – simonlchilds

+0

已編輯的代碼,它是GetDate我沒有收到HelloWorld。 – Anicho

回答

1

我想要一個解決方案,使我能夠讓我在帖子上的頁面通過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的部隊在我的upd上回發事件吃了面板,並解析了一串參數,我將這些參數發送到我的網站的後端。在回發上加載事件觸發器並觸發我在我的onload事件中執行的任何事情,在這種情況下,將這些項目放入數組中以將其拆分,然後將它們放入數據庫中。 Simples。感謝大家在這方面的幫助。 :D

2

可以運動,你爭取解決一些NIT-精選:

  1. 你並不需要包括,如果你的「數據」屬性沒有傳遞任何數據
  2. 你正在使用「POST」,但你沒有發佈任何數據 - 使用「GET」代替
  3. 你說你的contentType和dataTypes是JSON,但web方法返回一個字符串

post/get可能會解決這個問題 - 獲取比Post更安全。

它也可能有助於添加一個錯誤回調函數,以查看是否有更多關於請求失敗原因的信息。

+0

nope不是一個小姐點擊我。我最終會傳遞數據,POST最終會是真實的,因爲我將會傳遞用戶選擇的數據。 contentType和dataTypes不正確是的,這是真的。 – Anicho

+4

我不確定Anicho的身份驗證過程失敗,但此答案不正確。當調用ASPX頁面方法時,請求*必須*爲內容類型爲'application/json'的POST。使用GET或省略Content-Type將導致返回整個頁面,而不是運行靜態頁面方法並返回JSON。即使該方法返回一個字符串,ASP.NET也會自動從該方法返回這個JSON:'{「d」:「Date String Here」}。所以,'json'的dataType也是正確的(儘管最近版本的jQuery是不必要的)。 –

3

如果此頁面託管在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}" /> 

您可以更新該列表包括路徑到您的專頁。

+0

我已經看到類似的解決方案,而在週末1的研究中,因爲它可以工作而升高。雖然我需要該頁面也可以被sitecore看到。一個潛在的解決方案就是使用http處理程序加載一個.ashx頁面,該處理程序爲我完成了所有工作,然後使用IgnoreUrlPrefixes將該頁面的相關結果加載到sitecore中。 – Anicho