“未知的 Web 方法”(如果更改了 ASPX WebMethod 函数名称).动态编译问题

本文关键字:函数 WebMethod ASPX 问题 编译 动态 Web 未知的 未知 方法 如果 | 更新日期: 2023-09-27 18:36:23

我有一个独立的.ASPX页面(没有代码隐藏),其中包含一个简单的WebMethod,我通过JQuery Ajax调用它。见下文:

(请注意,这是概念验证代码,而不是生产代码!

<!DOCTYPE html>
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<html>
<head runat="server">
<title>Untitled</title>
<script runat="server" type="text/c#">
[System.Web.Services.WebMethod] 
public static int GetData(int Id)
{
    string connectionString = "Data Source=xxx;Initial Catalog=xxx;User Id=xxx;Password=xxx;";
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        string query = "SELECT AVG(Number) FROM Data WHERE ID = @Id;";
        using (SqlCommand command = new SqlCommand(query, connection))
        {
            command.Parameters.AddWithValue("@Id", Id);
            connection.Open();
            return (int)command.ExecuteScalar();
        }
    }
}
</script>
<script src="http://code.jquery.com/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
    function getAvg() {
        $.ajax({
            type: 'POST',
            url: "WebMethodAjaxExample.aspx/GetData",
            data: JSON.stringify({Id: $('#tbId').val()}),
            contentType: 'application/json',
            success: function (data, textStatus) {
                $('#theParagraph').text(data.d);
            }
        })
    }
</script>
</head>
<body>
<div>
<input type="text" id="tbId" />
<button onclick="getAvg()">Go</button>
</div>
<p id="theParagraph"></p>
</body>
</html>

我已经理智地检查了SQL查询,并知道它返回了一个FLOAT(七位和一位)。但是,正如你所看到的,我的WebMethod返回了一个int。因此,我的页面总是四舍五入数字。

我决定将 WebMethod 返回类型和 ExecuteScalar 强制转换更改为 Double。但页面仍然返回"7"。

经过一番修补,我了解到的最有趣的事实是,当我决定将 C# 代码中的 WebMethod 名称更改为 GetDatum,并对 JQuery Ajax 函数名称进行相关更改时,这次运行页面我从 Ajax 调用中获得了返回状态 500,其中"未知 Web 方法"作为错误消息。

感觉页面并没有像我期望的那样被动态重新编译,而是它仍然使用缓存版本,即使请求标头声明"无缓存"。

如果有任何帮助,该页面将托管在 SharePoint 2010 中。

谁能理解发生了什么?

更新:回收应用程序池可使最新的 WebMethod 代码正常工作,但在再次重置应用程序池之前不会反映进一步的更新。

“未知的 Web 方法”(如果更改了 ASPX WebMethod 函数名称).动态编译问题

我从另一个答案中抓住了这个,我似乎找不到链接,但你不需要重置整个应用程序池!我有一个使用 AJAX 从 Web 服务中提取数据的 ASMX 文件。我快疯了,因为更新 Web 服务并没有更改网页正在提取的数据。

将其添加到代码隐藏的页面加载中,它将清除缓存并使用新更新的 Web 服务:

Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetExpires(DateTime.Now);
Response.Cache.SetNoServerCaching();
Response.Cache.SetNoStore();

这完全符合我的需要,但我认为我真的只需要SetExpires行来清除此页面的缓存。