使用方法错误500的AJAX级联下拉列表

时间:2013-05-08 11:09:46

标签: asp.net web-services cascadingdropdown

我有一个c#cascadingdropdown在本地调试和在实时服务器上以调试模式完美地工作,但是当我通过浏览器实时查看页面时,我得到了[方法错误500]。如果我单击第一个下拉[方法错误500],然后使用[方法错误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   警告   模块名= “ManagedPipelineHandler”,   Notification =“MAP_REQUEST_HANDLER”,HttpStatus =“500”,   HttpReason =“内部服务器错误”,HttpSubStatus =“0”,ErrorCode =“The   操作成功完成。 (0x0)“,ConfigExceptionInfo =”“警告

为/wastedropdown.asmx/getwaste和wastedropdown.asmx / getbintype

生成了同样的错误

希望这对某人意味着什么!

EDIT2:

代码绝对可以在同一台服务器上的其他网站上正常运行。我得到Fiddler,得到以下错误:

  

{“消息”:“试图调用该方法   \ u0027GetWaste \ u0027使用GET请求,但不是   允许。“,”StackTrace“:”at   System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData   methodData,HttpContext context)\ r \ n at   System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext的   context,WebServiceMethodData   methodData)”, “ExceptionType”: “System.InvalidOperationException”}

HELP!

5 个答案:

答案 0 :(得分:1)

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

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

此致


答案 1 :(得分:0)

答案 2 :(得分:0)

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

这是通过使用Fiddler发现的,这是我的耻辱,以前从未使用过。我现在已经完全转换了!

答案 3 :(得分:0)

我找到的方法500只是由于正确设置了错误的代码或数据库安全权限。

因此,确保您的数据表正在返回数据(例如,IIS apppool是否具有正确的权限,并确保您的KnownCategoryvalues(例如bPLUID的值)和类别(例如Bintype)正确且在{{1}中正确的方式}和dr["bT"].ToString()。检查两种网络方法。

您可以通过调用来测试Web方法。浪费不应该需要价值观。 r["bPLUID"].ToString()));可能已知类别值= bPLUID:[此处输入id值]类别bintype。

恼怒但最终确实有效。

答案 4 :(得分:0)

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