如何return datatable 形成wcf rest 服务?

How to return datatable form wcf rest services?

我想 return 将数据表形式的 wcf rest 服务转换为 c# 形式,但是当 return 将数据表形式的服务器发送到客户端时出现以下错误。

Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host.

也许,问题是数据表的大小太大了。序列化数据表非常复杂,因此响应长度或深度可能会溢出。你可以尝试配置这个。

this post

但我的建议是:不要通过webservice用datatable响应:)你应该不知道,对方在听谁。

这是您问题的解决方案,请参考此博客并按照我遇到过类似问题的这些步骤操作 Remote Host Connectivity 以及用于返回数据的示例代码片段 table。

[WebMethod]
    public DataTable GetBankdtls(string pm_Action, string pm_bankid, string pm_name, string pm_Accno, string pm_branch, string pm_VidStr)
    {
        MySqlParameter[] param = new MySqlParameter[6];
        DataTable dt = new DataTable("Bank");
        cn = new MySqlConnection(conn);
        try
        {
            string query = "DML1_getbank_Sp";
            cmd = new MySqlCommand(query, cn);
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            cmd.CommandTimeout = 120;
            cmd.Parameters.AddWithValue("pm_Action", pm_Action);
            cmd.Parameters.AddWithValue("pm_bankid", pm_bankid);
            cmd.Parameters.AddWithValue("pm_name", pm_name);
            cmd.Parameters.AddWithValue("pm_Accno", pm_Accno);
            cmd.Parameters.AddWithValue("pm_branch", pm_branch);
            cmd.Parameters.AddWithValue("pm_VidStr", pm_VidStr);               
            cn.Open();
            da.SelectCommand = cmd;
            da.Fill(dt);
            return dt;
        }
        catch (MySqlException ex)
        {
            throw ex;
        }
        finally
        {
            cmd.Connection.Close();
            cn.Close();
        }
    }

并确保您的连接应该打开并在结束时关闭。

我已经找到了这个问题的解决方案。 当我们 return 数据表形成 wcf rest 服务时,数据表发生序列化问题。

           to avoid this problem convert datatable in to json stirg,and return this string to client side.
               on the client side convert this string to datatable.

服务器端代码:

       public string GetAssetRegisterDataTableBySp(ParameterDto parameters)
    {
        string jsonString="";
        string query = string.Format("SELECT * FROM ReportDisplaySetting where Display= 'true'");
        var DisplayColumnSetting = repositoryReportDisplaySetting.ExecuteRawQuery<ReportDisplaySetting>(query).ToList();
        List<string> selectedColumn = DisplayColumnSetting.Select(C => C.ColumnName).ToList();
        string columnOfString = (string.Join(",", selectedColumn.Select(x => x.ToString()).ToArray()));

        List<string> locationIds = new List<string>();
        if (parameters.locationId == 0)
        {
            locationIds = repository.All<CompanyLocationMaster>().AsEnumerable().Where(x => x.CompanyID == parameters.companyId && x.IsActive == true).Select(x => x.LocationID.ToString()).ToList();
        }
        string locationString = "";
        if (locationIds.Count() > 0)
        {
            locationString = string.Join(",", locationIds.ToArray());
        }
        else
        {
            locationString = parameters.locationId.ToString();
        }
        var report = new AssetrakRepository<AssetRegisterReport>();
        DataTable taggingReport = report.GetAssetRegisterReportBySP(parameters.companyId, locationString, columnOfString);
        string strColumns = columnOfString;
        var JSONString = new StringBuilder();
        if (taggingReport.Rows.Count > 0)
        {
            JSONString.Append("[");
            for (int i = 0; i < taggingReport.Rows.Count; i++)
            {
                JSONString.Append("{");
                for (int j = 0; j < taggingReport.Columns.Count; j++)
                {
                    if (j < taggingReport.Columns.Count - 1)
                    {
                        JSONString.Append("\"" + taggingReport.Columns[j].ColumnName.ToString() + "\":" + "\"" + taggingReport.Rows[i][j].ToString().Replace(","," ") + "\",");
                    }
                    else if (j == taggingReport.Columns.Count - 1)
                    {
                        JSONString.Append("\"" + taggingReport.Columns[j].ColumnName.ToString() + "\":" + "\"" + taggingReport.Rows[i][j].ToString().Replace(",", " ") + "\"");
                    }
                }
                if (i == taggingReport.Rows.Count - 1)
                {
                    JSONString.Append("}");
                }
                else
                {
                    JSONString.Append("},");
                }
            }
            JSONString.Append("]");

        }
        jsonString=JSONString.ToString();


        return jsonString;
    }

客户端代码:

        DataTable dt = ConvertJSONToDataTable(jsonString);


       protected DataTable ConvertJSONToDataTable(string jsonString)
    {
        DataTable dt = new DataTable();
        //strip out bad characters
        string[] jsonParts = Regex.Split(jsonString.Replace("[", "").Replace("]", ""), "},{");

        //hold column names
        List<string> dtColumns = new List<string>();

        //get columns
        foreach (string jp in jsonParts)
        {
            //only loop thru once to get column names
            string[] propData = Regex.Split(jp.Replace("{", "").Replace("}", ""), ",");
            foreach (string rowData in propData)
            {
                try
                {
                    int idx = rowData.IndexOf(":");
                    string n = rowData.Substring(0, idx - 1);
                    string v = rowData.Substring(idx + 1);
                    if (!dtColumns.Contains(n))
                    {
                        dtColumns.Add(n.Replace("\"", ""));
                    }
                }
                catch (Exception ex)
                {
                    throw new Exception(string.Format("Error Parsing Column Name : {0}", rowData));
                }

            }
            break; // TODO: might not be correct. Was : Exit For
        }

        //build dt
        foreach (string c in dtColumns)
        {
            dt.Columns.Add(c);
        }
        //get table data
        foreach (string jp in jsonParts)
        {
            string[] propData = Regex.Split(jp.Replace("{", "").Replace("}", ""), ",");
            DataRow nr = dt.NewRow();
            foreach (string rowData in propData)
            {
                try
                {
                    int idx = rowData.IndexOf(":");
                    string n = rowData.Substring(0, idx - 1).Replace("\"", "");
                    string v = rowData.Substring(idx + 1).Replace("\"", "");
                    nr[n] = v;
                }
                catch (Exception ex)
                {
                    continue;
                }

            }
            dt.Rows.Add(nr);
        }
        return dt;
    }