Невозможно отправить POST в службу WCF с помощью клиента Android - PullRequest
0 голосов
/ 17 мая 2011

У меня запущен веб-сервис WCF и клиентское приложение Android. Я могу получить или получить данные из веб-службы в формате json, однако я не могу отправить или отправить какие-либо данные на сервер.

Ниже приведен код службы WCF:

 [OperationContract]
 [WebInvoke(Method = "POST",
 UriTemplate = "/SetValue",
 RequestFormat = WebMessageFormat.Json,
 ResponseFormat = WebMessageFormat.Json,
 BodyStyle = WebMessageBodyStyle.Wrapped)]
 public string SetValue(TestClass someValue)
 {
     return someValue.Something.ToString();
 }

[DataContract]
public class TestClass
{
    [DataMember(Name = "something")]
    public int Something
    {
        get;
        set;
    }
}

Ниже приведен код от клиента Android:

 HttpClient httpClient = new DefaultHttpClient();
 HttpPost request = new HttpPost("http://xxx.xxx.x.x:8000/SetValue");
 List<NameValuePair> params = new ArrayList<NameValuePair>(1);
 params.add(new BasicNameValuePair("something", "12345"));
 request.setEntity(new UrlEncodedFormEntity(params));
 HttpResponse response = httpClient.execute(request);

Ниже показано, как я запускаю автономный сервис:

 class Program
 {
    static void Main()
    {
        Uri baseAddress = new Uri("http://localhost:8000/");

        using (WebServiceHost host = new WebServiceHost(typeof(ServerSideProfileService), baseAddress))
        {
            host.AddServiceEndpoint(typeof(ServerSideProfileService), new BasicHttpBinding(), "Soap");
            ServiceEndpoint endpoint = host.AddServiceEndpoint(typeof(ServerSideProfileService), new WebHttpBinding(), "Web");
            endpoint.Behaviors.Add(new WebHttpBehavior());

            // Open the service host, service is now listening
            host.Open();
        }
     }
  }

У меня есть только app.config, который просто имеет:

 <?xml version="1.0"?>
 <configuration>
 <startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>

Ответ, который я получаю, когда запускаю httpClient.execute (запрос) из клиента Android, включает:

 HTTP/1.1 400 Bad Request
 Request Error
 The server encountered an error processing the request. See server logs for more details.

И это во многом. Я очень новичок в WCF и не знаю, где будет находиться этот «журнал сервера», и затрудняюсь решить, как это устранить или отладить? (Я пробовал Fiddler2, но он, похоже, ничего не обнаруживает в клиенте Android.)

[EDIT]

я тоже пробовал

 JSONObject json = new JSONObject(); 
 json.put("something", "12345"); 
 StringEntity entity = new StringEntity(json.toString()); 
 entity.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
 entity.setContentType( new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));  
 request.setEntity(entity); 

, что также приводит к ошибке.

Я также заметил, что если я изменю 'SetValue', чтобы он возвращал константу, такую ​​как "abcd", вместо someValue.Something.ToString (), то все работает?

Ответы [ 4 ]

2 голосов
/ 28 июня 2011

У меня была такая же проблема, я решил эту проблему, удалив

BodyStyle = WebMessageBodyStyle.WrappedRequest

из моего заголовка метода WCF

 [WebInvoke(Method = "POST", UriTemplate = "mymethod", RequestFormat=WebMessageFormat.Json,
            BodyStyle = WebMessageBodyStyle.WrappedRequest,
                ResponseFormat=WebMessageFormat.Json)]

Изменено на

 [WebInvoke(Method = "POST", UriTemplate = "mymethod", RequestFormat=WebMessageFormat.Json,
                ResponseFormat=WebMessageFormat.Json)]
2 голосов
/ 17 мая 2011

Ваш клиентский код отправляет html-форму после форматированной полезной нагрузки, но ваш сервер ожидает полезную нагрузку json, вам нужно, чтобы клиент был что-то вроде

HttpClient httpClient = new DefaultHttpClient();
HttpPost request = new HttpPost("http://xxx.xxx.x.x:8000/SetValue");
StringEntity e = new StringEntity("{ \"something\":12345 }", "UTF-8");
request.setEntity(e);
request.setHeader("content-type", "application/json");
HttpResponse response = httpClient.execute(request);
0 голосов
/ 08 декабря 2012

Из того, что я нашел, Android преобразует строку JSON в поток байтового массива, а затем публикует ее.Вот мой собственный код в качестве примера

HttpPost httpPost = new HttpPost(URL_Base + uri);
httpPost.setEntity(new StringEntity(sJSONOut));
httpPost.setHeader("Accept", "application/json");
httpPost.setHeader("Content-type", "application/json");
HttpEntity oHttpEntity = new DefaultHttpClient().execute(httpPost).getEntity();

В eclipse, при установке точки останова на второй и последней строке и проверке свойств объекта httpPost я нахожу, что значение моего StringEntity не является байтовым массивом [123.43, 234 ...... несмотря на то, что я подтвердил, что моя строка sJSONOut правильно отформатирована json.

В другом ответе предлагается удалить BodyStyle = WebMessageBodyStyle.WrappedRequest из заголовка метода WCF.Это дало мне подсказку, что мне нужно было изменить эту строку с WrappedRequest на Bare, что и привело к работе.

BodyStyle = WebMessageBodyStyle.Bare

0 голосов
/ 04 мая 2012
    [WebInvoke(UriTemplate = "crud/delete",
        ResponseFormat = WebMessageFormat.Json,
        RequestFormat = WebMessageFormat.Json,
        BodyStyle = WebMessageBodyStyle.WrappedRequest,
        Method = "POST"
    )]        
    public SampleItem Delete(string id)
    {
        SampleItem item = new SampleItem();
        item.Id = 118;
        item.StringValue = id;
        return item;
        throw new NotImplementedException();
    }


var params  = '{"id":"sfs"}';

function postTest0(){
    $.ajax({
        url:'http://localhost/wcfrest/rest/crud/delete',
        //url:'http://localhost/wcfrest/rest/crud/create', //后台处理程序
        type:'post',    //数据发送方式
        dataType:'json', //接受数据格式
        contentType: "application/json",
        data:params, //要传递的数据
        timeout:1000,
        error:function(){alert('post error');},
        success:update_page //回传函数(这里是函数名)
    });
}

superfell 那个 正 解!

...