2012-05-16 2 views
1

이 내 WCF REST OperationContract를객체는 객체의 값은 null 또는 비어있는

[OperationContract(Name = "SaveBasicInfoObjectById")] 
    [WebInvoke(Method = "POST", 
      ResponseFormat = WebMessageFormat.Xml, 
      RequestFormat = WebMessageFormat.Xml, 
     BodyStyle = WebMessageBodyStyle.Bare, 
     UriTemplate = "Core/SaveBasicInfoObjectById?ID={ID}")] 
    List<Response> SaveBasicInfoObjectById(string ID, BasicClass basicClass); 

인이 내 클라이언트 코드

입니다
string ID= "123"; 

    MyService.BasicClass basicClass = new MyService.BasicClass(); 


    string sErrorMsg = ""; 
    string sResponseStatus = ""; 
string URLString = "http://localhost:59133/MyService.svc/Core/SaveBasicInfoObjectById?ID=" + ID; 


basicClass.FirstName = txt_Fname.Text.Trim(); 
basicClass.Lastname = txt_Lname.Text.Trim(); 

var paramContent = Serialize(basicClass); 

CreateWebRequest(URLString, paramContent.ToString()); 

이 는 직렬화 방법

입니다
public static string Serialize<T>(T obj) 
    { 

     var serializer = new System.Xml.Serialization.XmlSerializer(obj.GetType()); 
     var ms = new MemoryStream(); 
     serializer.Serialize(ms, obj); 
     string retVal = Encoding.Default.GetString(ms.ToArray()); 
     ms.Dispose(); 
     return retVal; 

    } 

이 내가 직면 오전 여기서 문제는 개체가 다음과 같은 형식으로 직렬화 인 CreateWebRequest 방법

private string CreateWebRequest(string endPoint, string paramContent) 
    { 
     string result = string.Empty; 

     byte[] buffer = Encoding.UTF8.GetBytes(paramContent); 
     var myHttpWebRequest = (HttpWebRequest)WebRequest.Create(endPoint); 

     myHttpWebRequest.Method = "POST"; 
     myHttpWebRequest.ContentLength = buffer.Length; 
     myHttpWebRequest.ContentType = "text/xml"; 

     using (var request = myHttpWebRequest.GetRequestStream()) 
     { 
      request.Write(buffer, 0, buffer.Length); 
      request.Close(); 
     } 

     var myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse(); 
     using (var reader = new StreamReader(myHttpWebResponse.GetResponseStream(), Encoding.UTF8)) 
     { 
      result = reader.ReadToEnd(); 
      myHttpWebResponse.Close(); 
     } 


     return result; 
    } 

* , 그리고 브레이크 포인트는 서비스에 명중 할 때 개체 값 빈 즉 FIRSTNAME는 = ""와 LASTNAME = ""*

<?xml version="1.0"?> 
<BasicClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" ID="0"> 
<FirstName xmlns="http://tempuri.org/">James</FirstName> 
<Lastname xmlns="http://tempuri.org/">Kravis</Lastname> 
</BasicClass> 

어느 한 조언 왜 이런 일이 수 있습니까?

내가 지금 "또는 빈 '과 같은 이름 및 성 요소에 대한 tempuri 네임 스페이스를 교체 한 지금이 작업 클라이언트의 값은 현재 다음 서비스

에 받았다되어 직렬화에 대한 업데이트 된 코드입니다 방법

public string Serialize<T>(T obj) 
    { 
     //System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(p.GetType()); 
     var serializer = new System.Xml.Serialization.XmlSerializer(obj.GetType()); 
     var ms = new MemoryStream(); 
     serializer.Serialize(ms, obj); 
     string retVal = Encoding.Default.GetString(ms.ToArray()); 
     ms.Dispose(); 
     return retVal.Replace("xmlns=\"http://tempuri.org/\"", ""); 
    } 

** 위의 코드를 업데이트 **

public string Serialize<T>(T obj) 
    { 
     var serializer = new System.Xml.Serialization.XmlSerializer(obj.GetType()); 
     var ms = new MemoryStream(); 
     serializer.Serialize(ms, obj); 
     string retVal = Encoding.Default.GetString(ms.ToArray()); 
     ms.Dispose(); 
     return retVal; 
    } 

** G 바꾸기 제거하고 대체 내가 기본 네임 스페이스 및 필요 없음을 제거 할 수 있어요 위와 같이함으로써 ** 요소에

public class BasicClass 
{ 
    [XmlElement(Namespace="")]//add namespace as "" 
    public string Firstname{get;set;} 

    [XmlElement(Namespace="")]//add namespace as "" 
    public string Lastname{get;set;} 
} 

추가되고 기본 네임 스페이스를 막을 수있는 방법을 발견 OT

<?xml version="1.0"?> 
<BasicClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" ID="0"> 
<FirstName>James</FirstName> 
<Lastname>Kravis</Lastname> 
</BasicClass> 

답변

1

기본적으로 WCF는 XmlSerializer이 아닌 serializer로 DataContractSerializer을 사용합니다. 그들은 다른 형식을 생성하고 기대하기 때문에 클라이언트 (XmlSerializer 대신 DataContractSerializer를 사용하여 개체 직렬화) 또는 서비스 (작업 또는 서비스 계약에 [XmlSerializerFormat] 특성을 적용하여 WCF에서 시리얼 라이저).

"xmlns"선언 (Serialize<T> 메서드의 마지막 줄)을 바꾸지 마십시오. 이렇게하면 생성 된 XML의 의미가 변경되기 때문입니다.

+0

저는 이것이 당신의 문제라고 확신합니다. 클라이언트가'XmlSerializer'를 사용하고 있지만, 서비스는'DataContractSerializer'를 사용하고 있습니다. 그들은 다른 형식을 생산합니다. –

+0

답변을 주셔서 감사합니다. 최신 업데이트를 확인해주세요. XMLElement 태그에 Namespace = ""을 추가하여 네임 스페이스를 제거했습니다. –