WCF Post Operation Contract返回400个错误请求

本文关键字:400个 错误 请求 返回 Contract Post Operation WCF | 更新日期: 2023-09-27 18:11:29

我有一个WCF服务,当我尝试通过post发送json和我的操作合同有一个参数时,我收到400个错误请求。

注意:如果我的操作合同中没有这样的参数。同样的请求可以完美地工作。

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

[OperationContract]bool AddCadastroJSon(字符串json);//参数为400的错误请求

My Contract

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);
    }
}

My HttpManager In 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天了,但还是解决不了这个问题

WCF Post Operation Contract返回400个错误请求

解决此问题使用与主端点相同的配置配置客户端端点

更改端点配置以接收wrapped,

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

    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请求。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;
            }
        }
    }