2015-09-05 118 views
0

我有一个WCF服务,当我尝试发送一个JSON后,我的操作合同有一个参数,我收到400个错误的请求。WCF后操作合同返回400错误的请求对于Android请求

Obs:如果我没有这样的操作合同参数。相同的请求完美地工作。

[OperationContract] //无参数工作正常。 bool AddCadastroJSon();

[OperationContract] bool AddCadastroJSon(String json); //带有参数400错误请求。

我的合同

namespace CadastroTelefonesService 
 
{ 
 
    [ServiceContract] 
 
    public interface ICadastro 
 
    { 
 
     
 
     [WebInvoke(Method = "GET", ResponseFormat =WebMessageFormat.Json,UriTemplate = "addcliente/{nome};{telefone}")] 
 
     [OperationContract] 
 
     bool AddCadastro(String nome, String telefone); 
 

 
     [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, UriTemplate = "listacliente")] 
 
     [OperationContract] 
 
     List<Cadastro> Lista(); 
 

 
     [WebInvoke(Method = "POST",ResponseFormat = WebMessageFormat.Json,RequestFormat = WebMessageFormat.Json,UriTemplate = "addclientejson")] 
 
     [OperationContract] 
 
     bool AddCadastroJSon(String cadastro); 
 
    } 
 
}

我HttpManager在Android中


 

 
/** 
 
* Created by Gabriel Santana on 8/26/2015. 
 
* Classe Responsável por fazer requisições HTTP e retornar um Request Package com o content. 
 
* 
 
*/ 
 
public class HttpManager { 
 
    public static String getData(RequestPackage p) { 
 

 
     BufferedReader reader = null; 
 
     HttpURLConnection con=null; 
 
     //OkHttpClient client=null; 
 
     URL url; 
 
     String uri = p.getUri(); 
 
     if (p.getMethod().equals("GET")) { 
 
      uri += "?" + p.getEncodedParams(); 
 
     } 
 

 
     try { 
 
      url = new URL(uri); 
 
      con = (HttpURLConnection) url.openConnection(); 
 
      //client = new OkHttpClient(); 
 
      // con = client.open(url); 
 
      con.setRequestMethod(p.getMethod()); 
 
      JSONObject json = new JSONObject(p.getParams()); 
 
      String params = "params="+json.toString(); 
 
      if (p.getMethod().equals("POST")) { 
 
       con.setDoOutput(true); 
 
       con.setRequestProperty("Accept" , "application/json"); 
 
       con.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); 
 
       //OutputStreamWriter writer = new OutputStreamWriter(con.getOutputStream()); 
 
       OutputStream os = con.getOutputStream(); 
 
       BufferedWriter writer = new BufferedWriter(
 
         new OutputStreamWriter(os, "UTF-8")); 
 
       writer.write(params); 
 
       writer.flush(); 
 

 
       writer.close(); 
 
       os.close(); 
 
      } 
 

 
      StringBuilder sb = new StringBuilder(); 
 
      reader = new BufferedReader(new InputStreamReader(con.getInputStream())); 
 

 
      String line; 
 
      while ((line = reader.readLine()) != null) { 
 
       sb.append(line + "\n"); 
 
      } 
 
      Log.i("fudeu",con.getResponseMessage()+con.getResponseCode()); 
 
      return sb.toString(); 
 

 
     } catch (Exception e) { 
 
      try { 
 
       Log.i("fudeu",con.getResponseMessage()+con.getResponseCode()); 
 
      } catch (IOException e1) { 
 
       e1.printStackTrace(); 
 
      } 
 
      e.printStackTrace(); 
 
      return null; 
 
     } finally { 
 
      if (reader != null) { 
 
       try { 
 

 
        reader.close(); 
 
       } catch (IOException e) { 
 
        e.printStackTrace(); 
 
        return null; 
 
       } 
 
      } 
 
     } 
 

 
    } 
 

 
}

我一直在尝试了3天,但我无法解决这个问题。

回答

0

I解决此问题配置主端点具有相同配置的客户端端点。

更改端点配置接收包梁,

更改我的数据合同接收流和反序列化后。

public bool AddCadastroJSon(Stream stream) 
    { 
     //Esse metodo recebe um stream pois a configuração o wcf não realiza o bind para a classe desejada. 
     StreamReader reader = new StreamReader(stream); 
     String JSONdata = reader.ReadToEnd(); 
     JavaScriptSerializer jsonSerializer = new JavaScriptSerializer(); 
     Cadastro cadastro = jsonSerializer.Deserialize<Cadastro>(JSONdata); 
     var cadastroDao = new CadastroDao(); 
     return cadastroDao.AddCadastro(cadastro); 
    } 

如果您将接收更改为流,则需要在您的android请求中删除标题。 public static String getData(RequestPackage p){

BufferedReader reader = null; 
    HttpURLConnection con=null; 
    //OkHttpClient client=null; 
    URL url; 
    String uri = p.getUri(); 
    if (p.getMethod().equals("GET")) { 
     uri += "?" + p.getEncodedParams(); 
    } 

    try { 
     url = new URL(uri); 
     con = (HttpURLConnection) url.openConnection(); 
     //client = new OkHttpClient(); 
     // con = client.open(url); 
     con.setRequestMethod(p.getMethod()); 
     JSONObject json = new JSONObject(p.getParams()); 
     String params = "{\"cadastro\":["+json.toString()+"]}"; 
     //String params =json.toString(); 
     if (p.getMethod().equals("POST")) { 
      con.setDoOutput(true); 
      //con.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); 
      //con.setRequestProperty("Content-Type", "application/json"); 
      //con.setRequestProperty("Accept" , "application/json"); 
      //OutputStreamWriter writer = new OutputStreamWriter(con.getOutputStream()); 
      OutputStream os = con.getOutputStream(); 
      BufferedWriter writer = new BufferedWriter(
        new OutputStreamWriter(os, "UTF-8")); 
      writer.write(p.getGson()); 
      writer.flush(); 

      writer.close(); 
      os.close(); 
     } 

     StringBuilder sb = new StringBuilder(); 
     reader = new BufferedReader(new InputStreamReader(con.getInputStream())); 

     String line; 
     while ((line = reader.readLine()) != null) { 
      sb.append(line + "\n"); 
     } 
     Log.i("fudeu",con.getResponseMessage()+con.getResponseCode()); 
     return sb.toString(); 

    } catch (Exception e) { 
     try { 
      Log.i("fudeu",con.getResponseMessage()+con.getResponseCode()); 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } 
     e.printStackTrace(); 
     return null; 
    } finally { 
     if (reader != null) { 
      try { 

       reader.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
       return null; 
      } 
     } 
    }