WebServiceHost 내에서 호스팅되는 WCF .NET 4.0을 사용하고 있습니다. 일반적으로 클래스 내에서 정의 된 클래스 배열을 사용할 때까지 모두 작동합니다.
서버 측 기능
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "foo")]
[OperationContract]
void Foo(FooQuery query);
클래스
[DataContract(Namespace="")]
public class FooQuery
{
[DataMember]
public MyFoo[] FooArray;
}
[DataContract(Namespace = "")]
public class MyFoo
{
[DataMember]
public string[] items;
}
고객 입장에서:
//create object
FooQuery myOriginalFoo = new FooQuery();
MyFoo _myFoo = new MyFoo();
_myFoo.items = new string[] { "one", "two" };
myOriginalFoo.FooArray = new MyFoo[] { _myFoo };
//serialize
var json = new JavaScriptSerializer().Serialize(myOriginalFoo);
string _text = json.ToString();
//output:
// {"FooArray":[{"items":["one","two"]}]}
var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://localhost:2213/foo");
httpWebRequest.ContentType = "application/json";
httpWebRequest.Method = "POST";
using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
streamWriter.Write(_text);
streamWriter.Flush();
streamWriter.Close();
}
//here server give back: 400 Bad Request.
var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
또한 System.Runtime.Serialization.Json.DataContractJsonSerializer를 사용하여 클래스를 조작 해 보았습니다. 서버로 보내고 webinvoke에서 400 오류를 반환 할 때까지 괜찮습니다. webInvoke가 어떻게 deserialize하는지 또는 다른 오류가 있는지 알지 못하는 이유는 무엇입니까?
트릭을 만드는 CollectionDataContract 라는 마법 속성을 찾았습니다 .
새 컬렉션 클래스 추가 :
[CollectionDataContract(Namespace = "")]
public class MyFooCollection : List<MyFoo>
{
}
변경된 쿼리 클래스
[DataContract(Namespace="")]
public class FooQuery
{
[DataMember]
public /*MyFoo[]*/MyFooCollection FooArray;
}
클라이언트 코드 변경 :
MyFooCollection _collection = new MyFooCollection();
_collection.Add(_myFoo);
myOriginalFoo.FooArray = _collection; //new MyFoo[] { _myFoo };
이제 모든 변수가 직렬화되었습니다. :) 예 .. 알아내는 데 많은 시간이 걸립니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다