调用WCF引用类型变量

时间:2011-07-11 11:04:14

标签: c# android wcf json

我对C#完全陌生。 我有一种服务方法

    //actual method
    public DataTable LoadDownLoadTablesData(string strBusinessUnit, string strExecutive, string strTableName, ref string strDate, string strTerritoryCode, string strUField1, string strUField2, string strUFeild3)
    {            
        DataTable ds = new DataTable();
        try 
            {
                XontPDAServiceDAL vu = new XontPDAServiceDAL();
                if (vu.validateExecutive(strBusinessUnit, strExecutive) == true)
                {
                    DownloadFetchBLL wmd = new DownloadFetchBLL();
                    strDate = DateTime.Now.ToString();
                    ds = wmd.LoadDownLoadTableData(strBusinessUnit, strExecutive, strTableName, strTerritoryCode, strUField1, strUField2, strUFeild3);
                }
                else
                {
                    throw new FaultException("Executive Not Active in the system.");
                }
        }
        catch (FaultException) { }
        catch (Exception ex)
        {
            throw new FaultException("Database Server is Not Responding." + ex.Message);
        }

        return ds;
    }

    //Converting datatable to String type
    public string LoadDownLoadTablesDataJson(string strBusinessUnit, string strExecutive, string strTableName, ref string strDate, string strTerritoryCode, string strUField1, string strUField2, string strUFeild3)
    {
        DataTable dtDownloadJson = new DataTable();
        dtDownloadJson = this.LoadDownLoadTablesData(strBusinessUnit, strExecutive, strTableName, ref strDate, strTerritoryCode, strUField1, strUField2, strUFeild3);
        return this.ConverTableToJson(dtDownloadJson);
    }


    //Converting table to json
    public String ConverTableToJson(DataTable dtDownloadJson)
    {
        string[] StrDc = new string[dtDownloadJson.Columns.Count];
        string HeadStr = string.Empty;

     //   if (dtDownloadJson.Columns.Count > 0)
      //  {

            for (int i = 0; i < dtDownloadJson.Columns.Count; i++)
            {

                StrDc[i] = dtDownloadJson.Columns[i].Caption;
                HeadStr += "\"" + StrDc[i] + "\" : \"" + StrDc[i] + i.ToString() + "¾" + "\",";
            }
            if (HeadStr.Length > 0)
            {
                HeadStr = HeadStr.Substring(0, HeadStr.Length - 1);
                StringBuilder Sb = new StringBuilder();
                Sb.Append("{\"" + dtDownloadJson.TableName + "\" : [");

                for (int i = 0; i < dtDownloadJson.Rows.Count; i++)
                {

                    string TempStr = HeadStr;
                    Sb.Append("{");

                    for (int j = 0; j < dtDownloadJson.Columns.Count; j++)
                    {
                        TempStr = TempStr.Replace(dtDownloadJson.Columns[j] + j.ToString() + "¾", dtDownloadJson.Rows[i][j].ToString());
                    }

                    Sb.Append(TempStr + "},");
                }

                Sb = new StringBuilder(Sb.ToString().Substring(0, Sb.ToString().Length - 1));
                Sb.Append("]}");
                return Sb.ToString();
            }else
            {
                return "0";
            }
       // }else{
       //     return "0";
       // }
    }

这个LoadDownLoadTablesData()引用变量就在那里。

我必须从Android调用此LoadDownLoadTablesDataJson(....),

我是这样打来的;

    // ksoap2 calling wcf
public SoapPrimitive soapPrimitiveData(String method_name1, String soap_action1, String NAMESPACE, String APPURL ,String tablename ) throws IOException,XmlPullParserException {

    SoapPrimitive responses = null;
    SoapObject request = new SoapObject(NAMESPACE, method_name1); // set up

    request.addProperty("strBusinessUnit", "HEMA");
    request.addProperty("strExec", "4515");
    request.addProperty("strTableName", "RD.AlternativeProductHeader");
    // after login we will get these fields value
    request.addProperty("strDate", "2000-04-29");
    request.addProperty("TerritoryCode", "KAND");

    request.addProperty("strUField1", "");
    request.addProperty("strUField2", "");
    request.addProperty("strUField3", "");


    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); // put all required data into a soap// envelope
    envelope.dotNet = true;
    envelope.setOutputSoapObject(request);
    AndroidHttpTransport httpTransport = new AndroidHttpTransport(APPURL);
    httpTransport.debug = true;
    try {
        httpTransport.call(soap_action1, envelope);
        responses = (SoapPrimitive) envelope.getResponse();

        Log.w("log_tag", "@@@@ 218 @@@@" + responses);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return responses;
}

这总是返回“0”。但是当我通过虚拟测试C#site时,它会返回一些结果。 参见

  String da1 = "2000-04-29";
        String s = client.LoadDownLoadTablesDataJson("HEMA", "4515", "RD.AlternativeProductHeader", ref da1, "KAND", "", "", "");
        Label1.Text = s;

输出是:

{"Table1" : [{"TableName" : "LoadDistributor","Description" : "Distributor ","MandatoryFlag" : "1","Status" : "","Priority" : "0"},{"TableName" : "LoadPrice","Description" : "Price ","MandatoryFlag" : "1","Status" : "","Priority" : "0"}]}

我混淆了我们想要如何使用Android传递引用类型?

请帮帮我..

提前致谢。

2 个答案:

答案 0 :(得分:1)

应该这样给出request.addProperty("strExecutive", "4515"); 不是request.addProperty("strExe", "4515");

我应该是服务参数名称。不能给出不同的名称

答案 1 :(得分:0)

看起来你的andriod请求中的属性名称与.NET Web服务方法上的参数名称不匹配:strExe!= strExecutive。