2017-12-22 20 views
0

인바운드 데이터를 잡는 웹 서비스가 있습니다.웹 서비스로 전송 된 JSON 배열의 괄호 처리 방법

ExceptionType : "System.InvalidOperationException" 
Message: "Type 'System.Collections.Generic.IDictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]' is not supported for deserialization of an array." 
at System.Web.Script.Serialization.ObjectConverter.ConvertListToObject(IList list, Type type, JavaScriptSerializer serializer, Boolean throwOnError, IList& convertedList) 
......... 

내가 몇 가지 테스트를했고,이 캐릭터 라인 JSON 배열의 브라켓과 관련이있다 : 수신 데이터가 캐릭터 라인 JSON 배열 인 경우, 단절은 500 수준 오류를 반환합니다. 문자열 화 된 JSON 객체 (중괄호 만)를 보내면 오류가 발생하지 않습니다. 나는. "{"id":111,"val":"x"}""[{"id":111,"val":"x"}]"

나를 혼란시키는 것은 웹 메서드에서 직렬화를 수행하지 않는다는 것입니다. 요청에 액세스하기 전에 모든 것이 업스트림으로 진행됩니다. 웹 방법은 다음과 같습니다 :

[WebMethod] 
[ScriptMethod] 
public void CatchData() 
{ 
    HttpRequest inboundRequest = HttpContext.Current.Request; 

    System.IO.Stream stream = inboundRequest.InputStream; 
    stream.Position = 0; 
    string contents = ""; 
    using (System.IO.StreamReader reader = new System.IO.StreamReader(stream, Encoding.UTF8)) 
    { 
     contents = reader.ReadToEnd(); 
    } 

} 

두 질문 :

나는 웹 메소드가 캐릭터 라인 JSON에 괄호를 처리 할 수 ​​있도록 변경하려면 어떻게해야합니까?

정확히 여기서 무슨 일이 벌어지고 있습니까? HttpContext.Current.Request.InputStream이 웹 메서드의 상류에서 사용 중이라는 사실을 깨닫는 데는 시간이 걸렸으므로 내용을 다시 읽으려면 위치를 0으로 설정해야합니다. 콘텐츠 유형 application/json으로 설정되어 있습니까? 콘텐츠 형식을 application/text로 설정하면 스트림을 다시 설정할 필요가 없습니다.

+0

예상되는 형식은 배열이지만 배열에 개체가 하나 뿐인 경우 단일 개체를 번갈아 가며 보입니다. –

답변

0

분명히 요청을 읽는 업스트림에 처리기가 구성되어 있어야합니다. 나는 webmethod 또는 scriptmethod가 처리기를 추가하는 것을 상상할 것입니다. 비록 당신이 복잡한 프로젝트에 있다면 httphandler가 작동 할 수도 있습니다. 전체 솔루션에 대해 더 많이 알지 못하면 더 좋은 대답은 불가능합니다.

원시 입력을 직접 처리하려면 httphandler를 빌드하고 등록하십시오.