2012-04-27 6 views
0

Android 휴대 전화에 저장된 정보를 WCF 서비스에 저장하려고합니다. 전화에서 400 오류가 발생하고 내 localhost에서 테스트 할 때 피들러를 사용하여 서버에 동일한 요청을 보내려고하면 내 Visual Studio가 내 저장 메서드에서 null 포인터를 팝업합니다. 나는 티로이 예제를 다음과 단지 작동하지 해요 : Tutorial 여기JSON 400 잘못된 요청과 널 포인터를 사용하여 Android to WCF

내 코드의 일부 : 다음은 WCF 서비스에서 내 사용자 개체의 내 IService

에서

[DataContract] 
public class User 
{ 
    [DataMember(Name= "userid")] 
    public int UserId { get; set; } 
    [DataMember(Name = "username")] 
    public string username { get; set; } 
    [DataMember(Name = "password")] 
    public string password { get; set; } 
    [DataMember(Name = "information")] 
    public Byte[] information { get; set; } 
} 

운영 계약

[OperationContract] 
    [WebInvoke(Method = "POST", 
     BodyStyle = WebMessageBodyStyle.Bare, 
     ResponseFormat = WebMessageFormat.Xml, 
     RequestFormat= WebMessageFormat.Json, 
     UriTemplate = "saveUser")] 
    Boolean saveUser(User user); 

^사용자가 null이기 때문에이 메소드는 널 포인터를 던지고 있습니다. WebMessageBodyStyle을 WrappedRequest로 변경하려고 시도했지만 도움이되지 않습니다.

을 heres POST 요청을 보낼 수있는 안드로이드 코드 :

JSONStringer user = new JSONStringer() 
       .object() 
        .key("user").object() 
        .key("userid").value("1").key("username").value(appState.getCurrentUser().username) 
         .key("password").value(appState.getCurrentUser().password) 
         .key("information").value(str.toString()) 
        .endObject() 
       .endObject(); 
      StringEntity entity = new StringEntity(user.toString()); 
      HttpPost request = new HttpPost(new URI(url)); 
      request.setHeader(HTTP.CONTENT_TYPE, "application/json"); 
      request.setHeader("Accept", "application/json"); 

      request.setEntity(entity); 
HttpResponse response = httpClient.execute(request); 

^응답이 나에게 서버에서 400 오류를주고있다.

다음은 로컬 호스트에 JSON을 보내는 피들러입니다 : Here's the picture 내가 내용 길이를 추가했지만 사진에 그것이 정말 어떤 도움이 극명하게 될 것이다 86은 0을 말한다.

+0

대신 'JSONObject'와'JSONObject.toString()'을 사용하는 것이 좋습니다. 더 명확하고 유용합니다. –

+0

Fiddler를 사용하여 요청을 검사하려고 시도 했습니까? – Rajesh

+0

피들을 사용하여 하단에 그림을 추가했습니다 – slai47

답변

0

는 [] 정말 문자열이고 때 JSON 개체 서비스가이 정보 문자열을 어디에 둘 것인지 파악할 수 없었습니다. 나는 이것을 발견하고 나서 완전한 멍청한 놈처럼 느껴진다.

0

봅니다 Fiddler에서 POST 요청을 수행하고 귀하의 요청은 다음과 뭔가를해야한다 : 당신은 내가 바이트를 전송 한 방법을 보면

POST http://localhost/SampleApp/Service1.svc/saveUser HTTP/1.1 
Content-Type: application/json 
Host: localhost 

{"userid":1,"username":"testuser","password":"testpassword","information":null} 
+0

메인 포스트에 그림을 추가했습니다. 나는 당신이 물었던 것을 따랐고, 그 다음 내용 길이를 더했습니다. 그것은 아직도 400을 돌려 보냈습니다. – slai47

+0

나는 잊었고 Visual Studio가 서비스에 보내지는 사용자에 대해 여전히 null 포인터를 넣었 기 때문에 포트를 추가했습니다. 그래서 지금 요청을 받고 있습니다. – slai47

+0

원시 요청이 어떻게 표시되는지 게시 할 수 있습니까 ?? – Rajesh

0

약간의 시간 잘못된 요청은 잘못된 오류입니다. 예를 들어, WCF 서버 측에 WritePermissionException이 있으면 잘못된 요청이 표시 될 수 있습니다. 혼란 스러우며 JSON 문자열 또는 요청과 관련이있는 항목을 의심스럽게 만들 수도 있지만 참으로 오류가 발생한 항목은 무의미한 항목입니다. 이 피를 디버그하는 데 많은 시간이 걸렸습니다. 잘못된 요청. 그래서 내 의견 :이 오류를 해결하기 위해

가장 좋은 방법입니다 : 진단을 WCF 서비스의 web.config 파일에서 설정을 가능하게

  • .당신이이 WCF에서 게시 로컬 IIS에 호스팅, 로컬 호출이있는 경우

<system.diagnostics> <sources> <source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true"> <listeners> <add name="xml" /> </listeners> </source> <source name="System.ServiceModel.MessageLogging"> <listeners> <add name="xml" /> </listeners> </source> <source name="myUserTraceSource" switchValue="Information, ActivityTracing"> <listeners> <add name="xml" /> </listeners> </source> </sources> <sharedListeners> <add name="xml" type="System.Diagnostics.XmlWriterTraceListener" initializeData="Traces.svclog" /> </sharedListeners> </system.diagnostics> 다음

  • ,

참고 :는 방법 WCF 휴식을 호출 예를 들어 REST 클라이언트 (고급 REST 클라이언트)을 chrome/firefox의 확장 프로그램으로 사용할 수 있습니다.