이 내 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>
저는 이것이 당신의 문제라고 확신합니다. 클라이언트가'XmlSerializer'를 사용하고 있지만, 서비스는'DataContractSerializer'를 사용하고 있습니다. 그들은 다른 형식을 생산합니다. –
답변을 주셔서 감사합니다. 최신 업데이트를 확인해주세요. XMLElement 태그에 Namespace = ""을 추가하여 네임 스페이스를 제거했습니다. –