【问题标题】:How do you resolve authorization issues with Ajax calls in ASP.NET?如何解决 ASP.NET 中 Ajax 调用的授权问题?
【发布时间】:2016-09-03 02:51:52
【问题描述】:

我在使用自动完成(来自数据库)文本框时遇到了问题。它对 ASP.NET (VB) 网页中的 WebMethod 进行 ajax 调用,每当在文本框中输入字母时都会给我一个“身份验证错误”。

aspx页面代码如下:

<body>
    <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
    <script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"></script>
    <script language="javascript" type="text/javascript">
        $(function () {
            $('#<%=txtCompanyName.ClientID%>').autocomplete({
                source: function (request, response) {
                    $.ajax({
                        url: '<%= ResolveUrl("VendorList.aspx/GetCompanyName")%>',
                data: "{ 'pre':'" + request.term + "'}",
                dataType: "json",
                type: "POST",
                contentType: "application/json; charset=utf-8",
                success: function (data) {
                    response($.map(data.d, function (item) {
                        return { value: item }    
                    }))
                },
                error: function (XMLHttpRequest, textStatus, errorThrown) {
                    alert(XMLHttpRequest.responseText);
                }
            });
        }
        });
        });
    </script>
    <div class="ui-widget" style="text-align:left">
        <asp:TextBox ID="txtCompanyName" runat="server" Width="350px" CssClass="textboxAuto"  Font-Size="12px" />
    </div>
</body>

文件代码背后的VB.NET代码如下:

Partial Class VendorList

<System.Web.Services.WebMethod()> _
<System.Web.Script.Services.ScriptMethod(ResponseFormat:=Script.Services.ResponseFormat.Json)> _
Public Shared Function GetCompanyName(ByVal pre As String) As List(Of String)
    Dim allCompanyNames As New List(Of String)
    Using myEntities As New VendorEntities()
        allCompanyNames = (From vendor In myEntities.Vendors
                           Where vendor.VendorName.StartsWith(pre)
                           Select vendor.VendorName).ToList()
    End Using
    Return allCompanyNames
End Function

End Class

我还尝试在包含此页面的目录中创建一个 Web.config 文件,代码如下:

<?xml version="1.0"?>
<configuration>
  <system.web>
    <authorization>
      <allow users="*"/>
    </authorization>
  </system.web>
</configuration>

我也在使用 FriendlyURLS。

关于如何解决此身份验证错误的任何想法?谢谢


更新

我现在也尝试了 AjaxControlToolkit AutoCompleteExtender,但我只返回页面的 HTML 标记列表,每个列表项一个字符。

aspx页面代码如下:

<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %>

<asp:Content ID="Content2" ContentPlaceHolderID="cpMainContent" Runat="Server">
        <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods = "true"></asp:ScriptManager> 
    <asp:TextBox ID="txtVendorNameSearch" runat="server"></asp:TextBox>
            <cc1:AutoCompleteExtender
                MinimumPrefixLength="2" ServiceMethod="SearchVendorNames"
                CompletionInterval="100" EnableCaching="false" CompletionSetCount="10"
                TargetControlID="txtVendorNameSearch" 
                ID="AutoCompleteExtender1" runat="server" FirstRowSelected = "false">
            </cc1:AutoCompleteExtender>

</asp:Content>

VB.NET代码隐藏文件代码如下:

Partial Class Operations_Inventory_AutoCompleteTest
    Inherits BasePage

    <System.Web.Script.Services.ScriptMethod(), _
    System.Web.Services.WebMethod()> _
    Public Function SearchVendorNames(ByVal prefixText As String, ByVal count As Integer) As List(Of String)

        Dim vendorNames As List(Of String) = New List(Of String)
        Using myEntities As New VendorEntities()
            Dim vendors = (From vendor In myEntities.InventoryVendors
                           Where vendor.VendorName.StartsWith(prefixText)
                           Select vendor.VendorName, vendor.ID).ToList()


            For Each item In vendors
                vendorNames.Add(AjaxControlToolkit.AutoCompleteExtender.CreateAutoCompleteItem(item.VendorName, item.ID.ToString))
            Next
        End Using
        Return vendorNames
    End Function
End Class

【问题讨论】:

  • 实际上,只要您尝试调用的 url 在同一个网络服务器中,您就不需要身份验证访问。
  • @WhiteHat - 我不确定这里的用户名和密码用什么。有没有办法让这个匿名?
  • @DinoMyte - URL 在同一个网络服务器上。事实上,如果我将 URL 从 VendorList.aspx 更改为只是 VendorList,我会收到“parseerror”,并且 XMLHttpRequest.responseText 返回客户端页面标记...
  • 还有更多关于错误的详细信息吗?

标签: javascript jquery asp.net ajax vb.net


【解决方案1】:

尝试使用 Ajax AutoCompleteExtender

你的 WebMethod 应该改变如下:

你应该返回类似下面的东西

List<string> items = new List<string>();
        foreach (var companyName in allCompanyNames)
            items.Add(AutoCompleteExtender.CreateAutoCompleteItem(companyName["VendorName"], companyName["ID"].ToString());

        return items;

希望您在 LINQ 查询中也选择公司名称的 ID。

 allCompanyNames = (From vendor In myEntities.Vendors
                       Where vendor.VendorName.StartsWith(pre)
                       Select vendor.VendorName, vendor.ID).ToList()

【讨论】:

  • 我确实尝试过这个,它似乎正在尝试工作,但它得到的结果与我将上面的 URL 从 VendorList.aspx 更改为 VendorList 时的结果相似。它在我键入时给了我一个下拉列表,但它包含整个客户端 html 标记的列表,而不是我的数据库查询结果。我确实尝试过使用标准 SQL 连接和实体连接,它们产生了相同的结果。您有什么想法可能导致这种情况吗?
  • 我找不到 AutoCompleteExtender 的 CreateAutoCompleteItem 方法。这有变化吗?
  • 您是否使用 AjaxControlToolkit 添加;在顶部;它在 15.1.4.0 afaik 中可用
  • 这可能对你有帮助aspsnippets.com/Articles/…
  • 我现在能够找到 CreateAutoCompleteItem 方法,因为我之前没有使用 AjaxControlToolKit 类。不过,我仍然遇到完全相同的问题,并且我已经用我尝试过的新代码更新了帖子。它来自与您之前提到的链接非常相​​似的帖子。 aspsnippets.com/Articles/…
【解决方案2】:

添加

beforeSend: function (xhr) { xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); },

为我的错误工作。

$.ajax({ 
    type: 'POST',
    beforeSend: function (xhr) { xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); },
    contentType: "application/json; charset=utf-8",

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多