【问题标题】:AJAX Cascading Dropdown with Method Error 500带有方法错误 500 的 AJAX 级联下拉列表
【发布时间】:2013-05-02 14:12:00
【问题描述】:

我有一个 c# cascadingdropdown,它可以在本地调试和实时服务器上的调试模式下完美运行,但是当我通过浏览器实时查看页面时,两个下拉菜单中都会出现 [方法错误 500]。如果我单击第一个下拉列表 [Method Error 500],然后使用 [Method Error 500] 填充第二个下拉列表。

这是 ASPX 代码:

<asp:DdlNoEventValidation ID="ddlWasteTypeList" runat="server" />
<asp:DdlNoEventValidation ID="ddlBinTypeList" runat="server" />

<asp:CustomValidator 
    ID="CustomValidator1" runat="server" 
    ControlToValidate="ddlBinTypeList"  
    OnServerValidate="CustomValidatorBinType_ServerValidate"
    ValidateEmptyText="True"
    >
</asp:CustomValidator>

<asp:CascadingDropDown ID="ccd1" runat="server"
    ServicePath="WasteDropDown.asmx"
    ServiceMethod="GetWaste"
    TargetControlID="ddlWasteTypeList"
    Category="Waste"
    PromptText="select waste" LoadingText="[Loading waste...]"
/>
<asp:CascadingDropDown ID="ccd2" runat="server"
    ServicePath="WasteDropDown.asmx"
    ServiceMethod="GetBinType"
    TargetControlID="ddlBinTypeList"
    ParentControlID="ddlWasteTypeList"
    Category="BinType"
    PromptText="select bin" LoadingText="[Loading bins...]"
/>

下面是 asmx 代码:

[ScriptService]
public class WasteDropDown : System.Web.Services.WebService 
{
    [WebMethod]
    public CascadingDropDownNameValue[] GetBinType(string knownCategoryValues, string category)
    {
        int wtID;
        StringDictionary kv = CascadingDropDown.ParseKnownCategoryValuesString(knownCategoryValues);
        if (!kv.ContainsKey("Waste") || !Int32.TryParse(kv["Waste"], out wtID))
        {
            throw new ArgumentException("Couldn't find waste type.");
        };

        SqlConnection conn = new SqlConnection(myConn.conn);
        conn.Open();
        SqlCommand comm;
        comm = new SqlCommand("dbo.sl_TLU", conn);
        comm.CommandType = CommandType.StoredProcedure;
        comm.Parameters.Add(new SqlParameter("@binWTID", SqlDbType.Int));
        comm.Parameters["@binWTID"].Value = wtID;

        SqlDataReader dr = comm.ExecuteReader();
        List<CascadingDropDownNameValue> l = new List<CascadingDropDownNameValue>();

        while (dr.Read())
        {
            l.Add(new CascadingDropDownNameValue(
            dr["bT"].ToString(),
            dr["bPLUID"].ToString()));
        }
        conn.Close();
        return l.ToArray();
    }

    [WebMethod]
    public CascadingDropDownNameValue[] GetWaste(string knownCategoryValues, string category)
    {
        SqlConnection conn = new SqlConnection(myConn.conn);
        conn.Open();

        SqlCommand comm;
        comm = new SqlCommand("dbo.sl_binQWT", conn);
        comm.CommandType = CommandType.StoredProcedure;

        SqlDataReader dr = comm.ExecuteReader();
        List<CascadingDropDownNameValue> l = new List<CascadingDropDownNameValue>();

        while (dr.Read())
        {
            l.Add(new CascadingDropDownNameValue(
            dr["binWT"].ToString(),
            dr["wtID"].ToString()));
        }
        conn.Close();
        return l.ToArray();
    }
}

日志中没有 ASP.Net 错误。但是,我在不同网站的同一台服务器上运行了一个类似的 ccd,并且运行良好 - 非常令人沮丧。

我确实看过this Stackoverflow question,但老实说,我并没有完全理解解决方案是什么——尽管我似乎在 bin 文件夹中没有任何重复的 dll。我真的认为问题出在某个地方。

我已经仔细检查了 SQL 查询,它们都返回了数据。

有什么建议吗?我已经用完了它们!

编辑:

我已经设置了失败的请求跟踪并得到了这个非常有用的结果:

MODULE_SET_RESPONSE_ERROR_STATUS 警告 ModuleName="ManagedPipelineHandler", Notification="MAP_REQUEST_HANDLER", HttpStatus="500", HttpReason="内部服务器错误", HttpSubStatus="0", ErrorCode="The 操作成功完成。 (0x0)", ConfigExceptionInfo=""警告

/wastedropdown.asmx/getwaste 和 wastedropdown.asmx/getbintype 产生了同样的错误

希望这对某人有意义!

EDIT2:

代码在同一服务器上的不同网站上肯定可以正常工作。我让 Fiddler 出现以下错误:

{"Message":"尝试调用方法 \u0027GetWaste\u0027 使用 GET 请求,这不是 允许。","StackTrace":" 在 System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData 方法数据,HttpContext 上下文)\r\n 在 System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext 上下文,WebServiceMethodData methodData)","ExceptionType":"System.InvalidOperationException"}

帮助!

【问题讨论】:

    标签: asp.net web-services cascadingdropdown


    【解决方案1】:
    【解决方案2】:

    我找到的答案是使用驼峰式方法名称,然后与一些 IIS 重写代码冲突,以确保 url 是小写的。

    这是通过使用 Fiddler 发现的,令我感到羞耻的是,它以前从未使用过。我现在完全皈依了!

    【讨论】:

      【解决方案3】:

      我发现的方法 500 只是由于代码不正确或数据库安全权限设置正确所致。

      因此,请确保您的数据表正在返回数据(例如 IIS 应用程序池是否具有正确的权限,并确保您的 KnownCategory 值(例如 bPLUID 的值)和类别(例如 Bintype)正确且在 dr["bT"].ToString() 中正确循环,和r["bPLUID"].ToString()));。检查两种网络方法。

      您可以通过调用来测试 Web 方法。得到浪费不应该需要价值观。 getBinWaste 可能会 已知类别值 =bPLUID: [在此处输入 id 值] 类别 bintype。

      令人恼火,但最终确实奏效了。

      【讨论】:

        【解决方案4】:

        我有同样的问题。在我安装其他角色服务后,Tt 工作然后停止。然后我摸索了几个小时,发现在站点的Handler Mappings中,*.asmx的一个脚本方法的版本号错误!查找公共令牌:B03F5F7F11D50A3A,如果您看到版本 2.0.0.0,则将其删除。而已。

        【讨论】:

          【解决方案5】:

          我认为这是因为您获得的数据太大。您必须将以下代码添加到您的 web.config 中:

          <system.web.extensions>
              <scripting>
                  <webServices>
                      <jsonSerialization maxJsonLength="5000000" />
                   </webServices>
               </scripting>
          </system.web.extensions>
          

          问候


          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多