簡體   English   中英

如果有參數,Asp.Net Web服務將返回空響應

[英]Asp.Net Web Service returns null response if it has arguments

我正在嘗試開發一個Android應用程序,該應用程序可以通過Web服務訪問存儲在sql服務器數據庫中的值。我的Web服務如果有參數,則返回null響應(如anyType {})。 不帶參數的Web方法工作正常。這是我的Web服務

[WebMethod]
public List<string> getDetails(string dist)
{
    details = new List<string>();
    string sel = "select h_Name,h_address,h_contact from hospital_tb    where h_district='" + dist + "'";
    SqlDataReader dr = db.dataRead(sel);
    while (dr.Read())
    {
        string name = dr["h_name"].ToString();
        string adres = dr["h_address"].ToString();
        string contact = dr["h_contact"].ToString();
        result = name + ":" + adres + ":" + contact;
        details.Add(result);
    }
    return details;
} 

Web服務命名空間為: http : //hospitalsearch.com/hos

這是我的Android代碼

class Async extends AsyncTask<String, String, String>
{
    @Override
    protected String doInBackground(String... params) {
        // TODO Auto-generated method stub
        request=new SoapObject(NAMESPACE, METHOD);
        property=new PropertyInfo();
        property.setName("district");
        property.setValue(dis);
        Log.d("condition", dis);

        request.addProperty(property);
        SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.dotNet=true;
        envelope.bodyOut=request;
        Log.d("ree", request.toString());
        HttpTransportSE transport=new HttpTransportSE(ADDRESS);
        try {
            transport.call(ACTION, envelope);
            //SoapPrimitive response=(SoapPrimitive)envelope.getResponse();
            response=(SoapObject)envelope.getResponse();
            Log.d("response", response.toString());
            if(response!=null)
            {
                parseData(response);
            }
            else
            {
                Log.d("result", "no data");
            }

        } catch (IOException e) {
            // TODO Auto-generated catch block
            res="error";
            Log.d("result", res);
            e.printStackTrace();
        } catch (XmlPullParserException e) {
            // TODO Auto-generated catch block
            res="error1";
            Log.d("result", res);
            e.printStackTrace();
        }
        return res;
    }

    @Override
    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub
        ll.setAdapter(adapter);
    }
    public void parseData(SoapObject result)
    {
        for(int i=0;i<result.getPropertyCount();i++)
        {
            if(result.getProperty(i) instanceof SoapObject)
            {
                parseData((SoapObject)result.getProperty(i));
            }
            else
            {
                PropertyInfo p=new PropertyInfo();
                result.getPropertyInfo(i, p);
                String name= result.getProperty(i).toString();
                Log.d("data", name);
                String[] re=name.split(":");
                Model model=new Model();
                model.setName(re[0]);
                model.setAddress(re[1]);
                model.setContact(re[2]);
                al.add(model);
            }
        }
    }
}

在這里,我發現該Web服務未接收到從我的Android代碼傳遞的參數。我還記錄了我的Request:Log.d(“ request”,request.toString());它顯示了getDetails {districts = AAAA}。

1)創建工作程序,如果需要另一個操作名稱創建,則更改SoapRequest類。

public abstract class SoapWorker extends AsyncTask<SoapWorker.SoapRequest,Void,Object> {

public static class SoapRequest{

    private LinkedHashMap<String,Object> params;
    private String methodName;
    private String namespace;
    private String actionName;
    private String url;
    public SoapRequest(String url, String methodName,String namespace){
        this.methodName = methodName;
        this.params = new LinkedHashMap<>();
        this.namespace=namespace;
        this.actionName=this.namespace + "IService/" + methodName;
        this.url=url;
    }
    public void addParam(String key,Object value){
        this.params.put(key,value);
    }
}

@Override
protected Object doInBackground(SoapRequest...  inputs) {
          SoapRequest input=inputs [0];

    try {
        SoapObject request = new SoapObject(input.namespace, input.methodName);
        for(Map.Entry<String, Object> entry : input.params.entrySet()){
            request.addProperty(entry.getKey(),entry.getValue());
        }
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.dotNet = true;
        envelope.setOutputSoapObject(request);
        HttpTransportSE androidHttpTransport = new HttpTransportSE(input.url);
        androidHttpTransport.call(input.actionName, envelope);
        input.params.clear();

        return parseResponse(envelope.getResponse());
    } catch (Exception e) {
        Log.e("SoapWorker", "error " + e);
        return e;
    }

}

@WorkerThread
public abstract Object parseResponse(Object response);


}

2)提出要求:

SoapWorker.SoapRequest request = new SoapWorker.SoapRequest(URL,METHOD,NAMESPACE);
    request.addParam(param1,value1);
    ...
    request.addParam(paramN, valueN);
    //for example:
    //request.addParam("district", dis);


    SoapWorker worker = new SoapWorker(){
        @Override
        public Object parseResponse(Object response) {
            //parse and return results
            //Log your response to see what you get from server
            return result;
        }

        @Override
        protected void onPostExecute(Object o) {
            super.onPostExecute(o);
            //update your model on UI
        }
    };

    worker.execute(request);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM