【问题标题】:500 Internal Server Error in asp.netasp.net 中的 500 内部服务器错误
【发布时间】:2016-06-05 21:19:36
【问题描述】:

问题概述:我正在创建一个应用程序,其中有一个 html 选择列表,我从中选择一个类别,并从该类别中使用 ajax webmethod 获取项目和图像。

问题概述: 我在 ajax linq to sql 中遇到了许多 500 错误并修复它。但是现在我正在处理 ado.net 应用程序,我面临的问题是当我从选择列表(catlist)中选择一个类别时,它会从这里 error: function (xhr) { alert(xhr.status);} 显示错误。

[ArgumentException]:未知的 Web 方法列表。 参数名称:methodName 在 System.Web.Script.Services.WebServiceData.GetMethodData(字符串方法名) 在 System.Web.Handlers.ScriptModule.OnPostAcquireRequestState(对象发送者,EventArgs eventArgs) 在 System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 在 System.Web.HttpApplication.ExecuteStep(IExecutionStep 步骤,Boolean& completedSynchronously) .

如何解决此错误。我想我简要描述一下我的问题。

Default.Aspx 代码概览:

下面是我的 HTML

<table>
    <tr>
        <td>
            <select id="catlist" runat="server" onchange="getImageUrl()"></select>
        </td>
        <td></td>
    </tr>
    <tr>
        <td>
            <img id="imgload" width="180" height="100" src="" alt="No Image Found" />
        </td>
        <td>
            <ul>
                <li>Description</li>
                <li>Loreum IspumLoreum IspumLoreum IspumLoreum IspumLoreum IspumLoreum IspumLoreum Ispum</li>
            </ul>
        </td>
    </tr>
</table>

下面是我的 Javascript 函数

function getImageUrl() {
        var catid = $("#catlist")[0].value;
        $.ajax({
            url: "Default.aspx/elist",
            data: { catId: catid },
            contentType: "Application/json; charset=utf-8",
            responseType: "json",
            method: "POST",
            success: function (response) {
                alert(response.d);
            },
            error: function (xhr) {
                alert(xhr.status);
            },
            Failure: function (response) {
                alert(response);
            }
        });
    }

Default.Aspx.cs 代码概览:

下面是我的自定义类

public class events
{
    public string EVE_NAME { get; set; }
    public string EVE_IMG_URL { get; set; }
    public string EVE_DESCRIPTION_SHORT { get; set; }
}

下面是Datatable方法

private static DataTable dt2(int catId)
{
    DataTable dataTable = new DataTable();
    SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=EVENT;Persist Security Info=True;User ID=sa;Password = 123");
        string query = "sp_view";

    SqlCommand cmd = new SqlCommand(query, conn);
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.Add("@catID", SqlDbType.Int).Value = catId;
    conn.Open();
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    da.Fill(dataTable);
    return dataTable;
 }

下面是WebMethod

[WebMethod]
private static List<events> elist(int catId)
{
     List<events> eve = new List<events>();
     eve = (from DataRow row in dt2(catId).Rows
           select new events
           {
                   EVE_NAME = row["EVE_NAME"].ToString(),
                   EVE_IMG_URL = row["EVE_IMG_URL"].ToString(),
                   EVE_DESCRIPTION_SHORT = row["EVE_DESCRIPTION_SHORT"].ToString(),
           }).ToList();
     return eve;
 }

注意: 数据库列名和事件类属性名相同。

【问题讨论】:

  • 我注意到您的 elist 方法是私有的。我不能说我自己做了很多,但也许这就是问题所在?如果公开会怎样?
  • 你可能会对这个线程感兴趣:stackoverflow.com/questions/18244696/… 因为 WebMethod 的本机行为返回 XML,而你似乎想要一些 Json。
  • @JonSkeet 是的,我的第一个错误是没有公开我的方法。
  • @DidierAupest 感谢上述线程。我只是缺少的是[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)],位于我在上面的线程中看到的[WebMethod] 属性下方。现在我终于得到了 json 格式的响应。再次感谢您的宝贵时间。
  • 第三,我发布了我的清晰代码,所以如果其他开发人员卡住了,他们很容易得到答案。

标签: javascript c# jquery asp.net ajax


【解决方案1】:

我只是将[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] 放在我的 web 方法属性之后,并将我与 web 方法关联的所有方法都公开。现在我的清除代码是:

    [WebMethod]
    [ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
    public static List<events> elist(int catId)
    {
        List<events> eve = new List<events>();
        eve = (from DataRow row in dt2(catId).Rows
               select new events
               {
                   EVE_NAME = row["EVE_NAME"].ToString(),
                   EVE_IMG_URL = row["EVE_IMG_URL"].ToString(),
                   EVE_DESCRIPTION_SHORT = row["EVE_DESCRIPTION_SHORT"].ToString(),
               }).ToList();
        return eve;
    }

    public static DataTable dt2(int catId)
    {
        DataTable dataTable = new DataTable();
        SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=EVENT;Persist Security Info=True;User ID=sa;Password = 123");
        string query = "sp_view";

        SqlCommand cmd = new SqlCommand(query, conn);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add("@catID", SqlDbType.Int).Value = catId;
        conn.Open();
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        da.Fill(dataTable);
        conn.Close();
        da.Dispose();
        return dataTable;
    }

【讨论】:

    【解决方案2】:

    WebMethod 必须是public,否则将无法从外部访问。

    【讨论】:

    • 是的,我的第一个错误是我没有公开我的网络方法。此外,当我将其公开时,它会显示 500 个内部服务器错误,因此我将[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] 放在我的 webmethod 之后。所以我很容易在 json 中得到我的回复。我还在下面发布了清晰的代码,您可以看到它。
    【解决方案3】:

    根据属性WebMethod的文档:

    https://msdn.microsoft.com/en-us/library/byxd99hx(v=vs.90).aspx

    WebMethod 属性附加到 Public 方法表示您希望该方法作为 XML Web 服务的一部分公开。您还可以使用此属性的属性来进一步配置 XML Web 服务方法的行为。有关详细信息,请参阅托管代码中 XML Web 服务的代码模型。

    我想,Jon Skeet 是对的。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-22
      • 2012-06-22
      • 1970-01-01
      • 2011-03-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-27
      • 1970-01-01
      相关资源
      最近更新 更多