2012-06-28 21 views
10

我有以下的jQuery的崗位到ASP.NET的webmethod 405錯誤(HTTP動詞POST不允許):jQuery的AJAX後接收

$.ajax({ 
    type: "POST", 
    url: "AjaxWebMethods.aspx/UpdNote", 
    contentType: "application/json; charset=utf-8", 
    data: "{'ID' : '" + id + "', 'note' : '" + note + "' }", 
    dataType: "json", 
    success: UpdNote_Success, 
    error: AjaxError 
}); 

和Web方法聲明:

[System.Web.Services.WebMethod(enableSession: true)] 
public static int UpdNote(int ID, string note) { 
    // business logic that eventually returns a number, but simplifying 
    // ... for the sake of brevity 
    int retNum = 99; 

    return retNum; 
} 

jQuery post和web方法在Windows Authenticated環境中都很好用(即 - 用戶通過LDAP進行身份驗證)。但是,最近我不得不將網站移動到使用RSA(雙因素身份驗證,PIN和令牌代碼)的服務器來驗證用戶身份,以便訪問網站。而我現在看到的是,我所有的jQuery帖子都返回「405錯誤」。

很明顯,跨網站的請求浮現在腦海中,但是沒有一件事情在這裏發生。所有jQuery AJAX帖子都使用在AjaxWebMethods.aspx中聲明的Web方法,該頁面駐留在站點自己的域中。

在此先感謝您的任何幫助或建議!

編輯:

在IE8中使用招給我多一點的信息。它返回的錯誤代碼仍然是405,但服務器錯誤更具描述性。服務器錯誤是「HTTP動詞POST用於訪問路徑'/AjaxWebMethods.aspx/UpdNote'是不允許的。」

我嘗試將ajax請求的類型參數更改爲GET,但我得到一個404代替(無法找到該資源)。

此外,忘了提及這是通過SSL(雖然我不認爲這會有所作爲)。

編輯:

,該網站正在使用,並且更具體地廣泛的測試(和廣泛的幫助從計算器的精明成員)我們已確定405錯誤,直接關係到應用程序池後爲應用程序池選擇的管理管道模式。

如果我使用面向v4.0(.NET Framework)和集成(管理流水線模式)的應用程序池,那麼我的AJAX文章工作得很好。但是,如果我使用面向v4.0和Classic(管理流水線模式)的應用程序池,那麼我會得到405錯誤。

所以在這一點上,我仍然在尋找一個解決這個問題的方法,儘管我已經能夠解決這個問題。

+0

爲什麼你需要'contentType'聲明?您將'datatType'設置爲JSON,並且*「數據將始終使用UTF-8字符集傳輸到服務器;您必須在服務器端正確解碼」。*因此部分也是不必要的 - [jQuery API] (http://api.jquery.com/jQuery.ajax/) –

+0

爲什麼你不使用完整的網址? (除非您爲了安全目的而刪除它) – gabeio

回答

3

在此基礎上:

jQuery的崗位,並在Windows身份驗證環境中Web方法都工作出色的(即 - 用戶通過LDAP身份驗證)。但是,最近我不得不將網站移動到使用RSA(雙因素身份驗證,PIN和令牌代碼)的服務器來驗證用戶身份,以便訪問網站。而我現在看到的是,我所有的jQuery帖子都返回「405錯誤」。

很顯然,錯誤與服務器配置有關,但要完全確定,如果可以的話,在RSA服務器創建新的網站和本網站禁用RSA認證,嘗試瀏覽您的網站只是要確保錯誤只與RSA身份驗證有關,丟棄新服務器中缺少的與代碼相關的組件/配置

一旦您丟棄了與代碼相關的配置問題,我會鼓勵您將其加倍檢查你的RSA配置(這可能會很棘手)。一旦我在一個使用RSA安全性的項目中工作,以實現跨服務器的SSO。 (單點登錄),我記得在服務器級別上安裝了一個RSA ISAPI篩選器,並且此篩選器負責讀取/設置身份驗證Cookie,以便針對Active Directory服務器驗證每個請求。

由於每個請求是由該過濾器管理,這ISAPI篩選器是在管道的頂部,每個請求都必須由RSA ISAPI篩選器首先以進行身份​​驗證

所以我的建議是雙重處理檢查RSA配置,以檢測是否有東西阻止您的AJAX帖子

我記得RSA配置就像一個黑魔法盒,我們沒有足夠的文檔和配置它是一個PITA。我衷心希望貴組織不是這種情況

+0

謝謝Jupaol!你給了我一些有用的指導。我會放棄一下,看看我能挖掘出什麼。我沒有在這臺服務器上安裝RSA,所以我的知識在這個舞臺上很缺乏,不幸的是。但是這聽起來像我不得不跳進去,讓我的手弄髒它的RSA部分。 – Jagd

+0

我很高興它有幫助。只有一件事,在挖掘RSA配置之前,確保部署到新服務器的站點實際上在該服務器中工作,爲此,在該服務器中創建一個站點並更改RSA身份驗證以進行Windows身份驗證,或只允許匿名用戶並確保你的AJAX調用工作。如果他們這樣做,那麼肯定會問題將與RSA配置(ISAPI篩選器)相關 – Jupaol

+0

好吧,我在同一臺服務器上安裝了一個新網站,並驗證了沒有RSA它就能正常工作。沒有RSA和沒有SSL,只使用Windows身份驗證,它確實有效。更近一步......我想。 – Jagd

0

爲了排除故障,嘗試將AJAX「POST」更改爲AJAX「GET」。將具有ajax post方法的頁面從我們的開發環境移動到我們的生產環境後,我遇到了一些類似的問題。

+0

感謝您的建議。我已經嘗試過,但沒有任何運氣。 – Jagd

0

HTTP 405是服務器錯誤,而不是代碼錯誤,表示資源(URL)正在通過錯誤的方法訪問。嘗試使用GET而不是POST。

+0

已經嘗試過,但沒有改變。 – Jagd

1

405 HTTP代碼是「不允許的方法」代碼。所以,你在新架構中有一些不正確的設置。這當然是一個服務器配置錯誤。這個錯誤可能來自許多地方,如果沒有訪問您的服務器,其他人會很難告訴您發生了什麼。但也許我可以給你一些起點......

你仔細檢查了你的web.config?對於這樣的錯誤來說,這將是一個常見的地方。

你檢查了你的IIS日誌嗎?那也是一個非常好的開始。

如果您嘗試POST而未設置請求的contentType,會發生什麼情況?也許你的頁面沒有設置爲接收JSON請求。

您是否嘗試過使用Fiddler?嘗試從外部客戶端發送POST請求。

更新

一些更多的建議:

您是否嘗試過禁用SSL?我會禁用它只是爲了確保問題不是SSL相關的。

你在做任何URL重寫?如果是這樣的話肯定會有關係。

您可以成功發佈到任何網址嗎?也許IIS完全禁用POST。如果是這樣,here is an article可以幫助你啓用它,here is a thread也可以幫助。

您是否試過將HttpPost添加到您的web.config?類似這樣的:

<webServices> 
    <protocols> 
     <add name="HttpPost" /> 
    </protocols> 
</webServices> 
+0

這可能是它與IIS或RSA的配置錯誤,但通過發佈在stackoverflow我希望有人運行類似的情況(RSA + jQuery AJAX帖子)可以告訴我,它爲他們工作,也許指向我在一些有用的方向。 – Jagd

+0

關於你的其他建議 - 1)我不知道我會在web.config中尋找什麼,甚至會對此產生影響。正如我在原始問題中所說的那樣,它在沒有使用RSA身份驗證的情況下運行,但在RSA到位時不起作用。這並不導致我相信它與web.config有任何關係,除非需要設置一些我不知道的不明確的標記。 – Jagd

+0

a)沒有檢查IIS日誌,所以我會放棄它。 b)頁面設置爲與json一起工作,並且在RSA到位之前這樣做很好。 c)是的,我嘗試了提琴手但沒有帶任何東西。從所有外觀來看,當我運行Fiddler時,它甚至不像是在向服務器發送AJAX帖子。 – Jagd

0

也許你的服務器沒有安裝ajax擴展。嘗試標記對CopyLoacal = true的引用並將bin文件夾部署到網絡服務器。