【问题标题】:ASP.NET Calling WebMethod with jQuery AJAX "401 (Unauthorized)"使用 jQuery AJAX“401(未经授权)”的 ASP.NET 调用 WebMethod
【发布时间】:2014-05-26 20:23:59
【问题描述】:

坚持了好几个小时

{"Message":"Authentication failed.","StackTrace":null,"ExceptionType":"System.InvalidOperationException"}

我正在尝试在我的 ASP.Net Webform 中调用此 WebMethod

[WebMethod]
public static string GetClients(string searchTerm, int pageIndex)
{
    string query = "[GetClients_Pager]";
    SqlCommand cmd = new SqlCommand(query);
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.AddWithValue("@SearchTerm", searchTerm);
    cmd.Parameters.AddWithValue("@PageIndex", pageIndex);
    cmd.Parameters.AddWithValue("@PageSize", PageSize);
    cmd.Parameters.Add("@RecordCount", SqlDbType.Int, 4).Direction = ParameterDirection.Output;
    return GetData(cmd, pageIndex).GetXml();
}

来自这个 jquery.ajax

function GetClients(pageIndex) {
    $.ajax({
        type: "POST",
        url: "ConsultaPedidos.aspx/GetClients",
        data: '{searchTerm: "' + SearchTerm() + '", pageIndex: ' + pageIndex + '}',
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: OnSuccess,
        failure: function (response) {
            alert(response.d);
            },
            error: function (response) {
                alert(response.d);
            }
    });
}

但我总是得到这个错误:

发布http://localhost:64365/ConsultaPedidos.aspx/GetClients 401 (未经授权)

奇怪的是,这在我开始验证用户之前一直有效

<system.web>
...
    <authentication mode="Forms">
      <forms loginUrl="~/Account/Login" timeout="2880" defaultUrl="/Dashboard" />
    </authentication>
    <authorization>
      <deny users="?" />
    </authorization>
...
</system.web>

有什么想法吗?

【问题讨论】:

    标签: c# jquery asp.net ajax webmethod


    【解决方案1】:

    问题解决了

    这让我发疯了。

    ~/App_Start/RouteConfig.cs 内更改:

    settings.AutoRedirectMode = RedirectMode.Permanent;
    

    收件人:

    settings.AutoRedirectMode = RedirectMode.Off;
    

    (或者只是注释该行)

    此外,如果启用了友好 URL,您需要更改

    url: "ConsultaPedidos.aspx/GetClients",
    

    收件人:

    url: '<%= ResolveUrl("ConsultaPedidos.aspx/GetClients") %>',
    

    希望这对其他人有帮助

    【讨论】:

    • 感谢您的回答,这为我解决了问题。我在几个网站上看到有人问过这个问题,但你是唯一一个提供解决方案的人。
    • @iLQ 非常感谢,关闭 RedirectMode 对我有用
    • @iLQ 感谢您的回答。 :)
    • @iLQ 你是怎么想出来的!太棒了...这解决了问题,但我仍然不知道为什么!?有什么想法吗?
    • 我也有同样的问题!但是我使用的是 Asp.net web 项目,我没有 ~/App_Start/RouteConfig.cs....我该如何解决它..
    【解决方案2】:

    ~/App_Start/RouteConfig.cs里面改

    settings.AutoRedirectMode = RedirectMode.Permanent;
    

    settings.AutoRedirectMode = RedirectMode.Off;
    

    【讨论】:

    • 这是我第二次遇到这种情况。
    • 您能解释一下为什么我们需要这样做吗?
    【解决方案3】:

    401 Unauthorized 表示:

    • 未提供用户身份验证
    • 已提供但未通过身份验证测试

    这证实了你所说的添加身份验证,它显然也涵盖了这种方法。

    因此,您是否希望公开访问此方法?

    公开

    • 您需要从此方法中删除身份验证。

    要允许访问公共资源(例如此网络方法),您只需将其放在同一目录中的配置文件中:

     <authorization>
            <allow users="*" /> 
     </authorization>
    

    如果您在上面添加标签,那么它将授予所有类型的用户对所有资源的访问权限。因此,您可以添加下面的标签来授权网络服务

    <location path="YourWebServiceName.asmx">
    <system.web>
      <authorization>
        <allow users="*"/>
      </authorization>
    </system.web>
    

    私人

    • 您需要确保跨线路发送身份验证(使用Fiddler 检查 cookie),并确保它正在通过 asp.net 身份验证。

    【讨论】:

    • 感谢您的回答。我已经尝试过&lt;allow users="*"&gt;,但我得到了相同的响应,当检查 Fiddler 上的 cookie 时,它​​说:This response did not set any cookies.
    • 这看起来像是罪魁祸首,没有任何 cookie,任何身份验证都会失败 - 所以要弄清楚如何从方法中删除身份验证。
    【解决方案4】:

    你只需要在 ~/App_Start/RouteConfig.cs 中注释掉

      // settings.AutoRedirectMode = RedirectMode.Permanent;
    
                 (Or do this)
    
        settings.AutoRedirectMode = RedirectMode.Off;
    

    与 Web.config 文件中的 Authentication 无关。

    【讨论】:

    • 在我的情况下,我在路由配置中有友好的 URL 设置,默认情况下将 AutoRedirectMode 设置为永久,服务方法在关闭后触发。谢谢。
    【解决方案5】:

    不是专家,但您尝试过将&lt;allow users="*"/&gt; 放入配置文件吗? 您的请求应该使用 GET 方法而不是 POST(用于创建)。

    编辑:您似乎正在使用无法从客户端调用的 SOAP 方法,您应该使用 RESFUL 服务。

    【讨论】:

    • 是的,我已经试过了。尝试在开始身份验证之前将所有内容都放在原样,但我得到了相同的响应。
    • 我认为您的 webmethod 只能从服务器端调用,但不确定。
    • @Hatsjoem:不是真的。它可以从客户端调用。它的一些身份验证问题。无论如何努力+1
    【解决方案6】:

    我发现这个问题试图解决同样的问题,我解决的方法在这里没有看到所以我发帖给陷入同样瓶颈的人:

    尝试在您的方法中使用 WebMethod 属性中的EnableSession = true

    喜欢

    [WebMethod(EnableSession = true)]
    public static string MyMethod()
    {
        return "no me rindo hdp";
    }
    

    这样就解决了我的 401 错误。希望对您有所帮助。

    【讨论】:

      【解决方案7】:

      在我的例子中,我将 WebMethod 添加到表单上的控件中。它需要添加到页面本身。

      【讨论】:

        【解决方案8】:

        我遇到了同样的问题,首先尝试了可用的解决方案,它确实有效。但是我意识到如果我创建一个新的web-service 并将相关代码添加到web-service 文件的App_Code 文件夹中,那么我不会收到任何错误。

        【讨论】:

        • 你能再具体一点吗?我也试过这些东西,但错误刚刚改变,它进入错误事件:状态:错误错误:内部服务器错误,没有详细信息。谢谢
        • 没关系,我搞定了。它期待 JSON,所以我不得不 JSON.stringify(..datavalue),它现在可以工作了。
        【解决方案9】:

        我知道您的回答已被接受。它实际上发生在创建 Web 窗体应用程序而不将 Authentication 更改为 No Authentication 时。

        我们看到的默认身份验证为Authentication: Individual User Account

        改成Authentication: No Authentication就不会报错了

        【讨论】:

        • 想指出,这确实发生在 2017 VS(我使用社区版)和 Web 表单应用程序中,即使使用“无身份验证”也是如此。我必须按照上面的详细说明修改 routeconfig .cs。
        【解决方案10】:

        我的网站正在使用 ASP.NET 表单身份验证,我通过反复试验得出结论,只有在 .asmx 页面上并使用 contentType: "application/x-www-form-urlencoded"dataType: "xml" 调用 Web 方法时,我才能使其工作。 /p>

        【讨论】:

          【解决方案11】:

          在我的情况下,问题出在调用 Ajax.asmx 的 URL 中,根据网络服务器设置,此 URL 不正确,例如"/qa/Handlers/AjaxLib.asmx/" 为我工作而不是 "/Handlers/AjaxLib.asmx/"(在我的特定情况下在 PROD 服务器上工作正常):

            $.ajax({
            url: '/qa/Handlers/AjaxLib.asmx/' + action,
            type: "POST",
            async: false,
            data: data,
            contentType: "application/json; charset=utf-8",
            success: function () {
          

          然后我的 AJAX 被调用超出了我的 IIS 虚拟应用程序目录“qa”的范围,因此发生了授权错误 ({"Message":"Authentication failed.","StackTrace":null,"ExceptionType":"System.InvalidOperationException"}).

          【讨论】:

            【解决方案12】:

            允许使用 ASP.NET AJAX 从脚本调用此 Web 服务。将以下属性添加到类中

            [System.Web.Script.Services.ScriptService]
            

            我遇到了类似的问题,添加此属性解决了它。

            【讨论】:

              【解决方案13】:

              对我来说,我的 JQuery Ajax 调用中有一个无效的“data:”参数。但不是 .NET 或 JQuery 抱怨参数值,而是(在我看来具有误导性)得到 401 Unauthorized 错误。

              【讨论】:

                猜你喜欢
                • 2017-04-22
                • 1970-01-01
                • 2018-10-08
                • 2023-03-23
                • 1970-01-01
                • 1970-01-01
                • 2021-12-19
                • 2012-04-09
                • 2018-10-23
                相关资源
                最近更新 更多