调用从Android </classinstance>返回Task <classinstance>的WCF Web服务

时间:2013-04-03 08:10:32

标签: android .net wcf async-await

我有一个.NET 4.5 WCF Web服务,它在界面中包含以下代码:

[OperationContract]
[WebInvoke(Method = "POST",
    BodyStyle = WebMessageBodyStyle.Wrapped,
    UriTemplate = "UpdCategorieArticoli",
    RequestFormat = WebMessageFormat.Json,
    ResponseFormat = WebMessageFormat.Json)]
Task<JsonGenericResponse> UpdCategorieArticoli(string jsonData);

并且实施(在合成中):

public async Task<JsonGenericResponse> UpdCategorieArticoli(string jsonData)
{
    JsonGenericResponse objWmJson = new JsonGenericResponse();
    objWmJson.IsInError = "true";
    try
    {
        DataIfCloudEspresso objData = new DataIfCloudEspresso();
        string xmlData = <some transformation from json>;
        int intUpdatedCount = await objData.UpdCategorieArticoli(xmlData );
        if (intUpdatedCount == 1)
        {
            objWmJson.IsInError = "false";
            objWmJson.Value = intUpdatedCount.ToString();
        }
        return objWmJson;
    }
}

JsonGenericResponse是一个类:

public class JsonGenericResponse
{
    string _Value;
    public string Value
    {
        get
        {
            return _Value;
        }
        set
        {
            _Value = value;
        }
    }
    .... Other properties
}

数据层中的被调用方法:

public async Task<int> UpdCategorieArticoli(string xmlData)
{
    try
    {
        using (SqlConnection objConn = new SqlConnection(base.ConnectionString))
        {
            using (SqlCommand cmdADO = new SqlCommand("spUpd_CategorieArticoli", objConn))
            {
                cmdADO.Parameters.Add(new System.Data.SqlClient.SqlParameter("@XMLDoc", SqlDbType.Text));
                cmdADO.Parameters["@XMLDoc"].Value = xmlData;
                cmdADO.Parameters.Add(new System.Data.SqlClient.SqlParameter("@RETURN_VALUE", SqlDbType.Int));
                cmdADO.Parameters["@RETURN_VALUE"].Direction = ParameterDirection.ReturnValue;
                //
                cmdADO.CommandType = CommandType.StoredProcedure;
                //
                await objConn.OpenAsync();
                await cmdADO.ExecuteNonQueryAsync();
                return (int)cmdADO.Parameters["@RETURN_VALUE"].Value;
            }
        }
    }
}

这个代码是从jQuery成功调用的,它正在工作,调用为

$.ajax({
    type: "POST",
    url: "WEspresso.svc/UpdCategorieArticoli",
    data: strData,
    async: true,
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    complete: saveCategorieArticoli_onComplete
});

在回调中,我可以按照预期看到基于JsonGenericResponse类的json字符串。

当我尝试从Android调用此Web服务时出现问题。 如果我实施合同

[OperationContract]
[WebInvoke(Method = "POST",
    BodyStyle = WebMessageBodyStyle.Wrapped,
    UriTemplate = "UpdCategorieArticoliSync",
    RequestFormat = WebMessageFormat.Json,
    ResponseFormat = WebMessageFormat.Json)]
JsonGenericResponse UpdCategorieArticoliSync(string jsonData);

如果我在Visual Studio 2012中使用断点调试站点启动时,实现中的一些虚假代码我可以看到该方法已到达,相反,如果我尝试调用返回Task&lt;&gt;的方法从我的Android代码中无法访问Visual Studio 2012中的断点:

public class wsWcfUpdCateg extends AsyncTask<String, Integer, String>{
    public final String SOAP_ACTION = "http://tempuri.org/UpdCategorieArticoli";
    public  final String SOAP_ADDRESS = "http://192.168.0.1/CloudTest/wespresso.svc/UpdCategorieArticoli";
public Context maincontext; 
HttpResponse objResponse = null;

@Override
protected void onPostExecute(String result) {
    super.onPostExecute(result);             
}

@Override
protected String doInBackground(String... arg0) {
    StringBuilder objString = new StringBuilder();
    try
    {
        HttpClient objHttpClient = new DefaultHttpClient();
        HttpConnectionParams.setConnectionTimeout(objHttpClient.getParams(), 10000);
        JSONObject json = new JSONObject();
        HttpPost objPost = new HttpPost(SOAP_ADDRESS);
        //
        ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("jsonData", arg0[0].toString()));
        for (NameValuePair p : params){
            json.put(p.getName(), p.getValue());
        }        
        StringEntity se = new StringEntity(json.toString());
        objPost.setEntity(se);
        objPost.setHeader("Accept", "application/json");
        objPost.setHeader("Content-type", "application/json");  
        objResponse = objHttpClient.execute(objPost);              
        StatusLine objStatusLine = objResponse.getStatusLine();
        Integer intStatus = objStatusLine.getStatusCode();              
        //
        return objString.toString() ;    
    }   
}

}

在上面的代码中,intStatus是400,如果我只是将UpdCategorieArticoli更改为UpdCategorieArticoliSync而不是我得到200(并且达到了.NET代码中的断点)。 如何实现Android代码,以便它可以使用返回Task的WCF方法,JSON作为响应格式?我应该使用Android的“同步版本”,否则没有希望?

0 个答案:

没有答案
相关问题