2015-12-17 37 views
0

我有WCF Web服务,它具有正确的XML序列化POST方法

[OperationContract] 
[WebInvoke(Method = "PUT", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Xml)] 
void ScanPatient(PatientInfo patientInfo); 

//... 

[XmlRoot("PatientInfo")] 
public class PatientInfo 
{ 
    [XmlElement("FirstName")] 
    public string FirstName { get; set; } 
    [XmlElement("LastName")] 
    public string LastName { get; set; } 
    [XmlElement("SSN")] 
    public string SSN { get; set; } 
    [XmlElement("Birthday")] 
    public DateTime? Birthday { get; set; } 
    [XmlElement("RequestedClientID")] 
    public Guid RequestedClientID { get; set; } 
    [XmlElement("patientId")] 
    public Guid patientId { get; set; } 
} 

我使用的WebRequest与此服务

private void ExecuteWebServiceCommand(string method, string command, string parameters = "") 
{ 
    var request = (HttpWebRequest)WebRequest.Create(new Uri(command)); 
    request.ContentType = "application/xml"; 
    request.Method = method; 

    string responseFromServer = null; 
    byte[] bytes = Encoding.UTF8.GetBytes(parameters); 

    request.ContentLength = bytes.Length; 
    using (var newStream = request.GetRequestStream()) 
    { 
     newStream.Write(bytes, 0, bytes.Length); 
    } 
    var response = request.GetResponse(); 
} 

它的工作原理进行沟通下一PUT方法完美的,如果parameters一个格式用于:

<PatientInfo><FirstName>{0}</FirstName><LastName>{1}</LastName><RequestedClientID>{2}</RequestedClientID></PatientInfo> 

很显然,我不想手动创建数据,因为每个新字段都需要更新模板。所以,我试图使用XMLSerializer

private string SerializeToString(object data) 
{ 
    if (data == null) return null; 
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
    ns.Add("", ""); 

    using (var stringwriter = new System.IO.StringWriter()) 
    { 
     var serializer = new XmlSerializer(data.GetType(), ""); 
     serializer.Serialize(stringwriter, data, ns); 
     return stringwriter.ToString(); 
    } 
} 

但是序列化PatientInfo,当我得到一个结果:

"<?xml version=\"1.0\" encoding=\"utf-16\"?>\r\n<PatientInfo>\r\n <FirstName>Andrew</FirstName>\r\n <LastName>Fox</LastName>\r\n <Birthday d2p1:nil=\"true\" xmlns:d2p1=\"http://www.w3.org/2001/XMLSchema-instance\" />\r\n <RequestedClientID>2c547deb-2395-4334-b1b0-58e6562b5843</RequestedClientID>\r\n <patientId>00000000-0000-0000-0000-000000000000</patientId>\r\n</PatientInfo>" 

它不适合ExecuteWebServiceCommand,给我(400)错误的请求例外。

那么,如何正确地将对象序列化为XML,使其适合这样的代码?或者我该如何使用模式代码来接受这些数据?

+0

至少,我想知道,我如何配置序列化器来删除该“序言”的东西,并从结果控制字符。 – lentinant

回答

1

您应该使用XmlWriter,您使用正确的XmlWriterSettings实例化以省略Xml声明并且没有序列化换行符。当将其应用到你的代码,你会这样结束了:

private string SerializeToString(object data) 
{ 
    if (data == null) return null; 
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
    ns.Add("", ""); 

    // what should the XmlWriter do? 
    var settings = new XmlWriterSettings 
    { 
     OmitXmlDeclaration = true, 
     NewLineChars = "" 
    }; 

    using (var stringwriter = new System.IO.StringWriter()) 
    { 
     // Use an XmlWriter to wrap the StringWriter 
     using(var xmlWriter = XmlWriter.Create(stringwriter, settings)) 
     { 
      var serializer = new XmlSerializer(data.GetType(), ""); 
      // serialize to the XmlWriter instance 
      serializer.Serialize(xmlWriter, data, ns); 
      return stringwriter.ToString(); 
     } 
    } 
} 

哪位能给我这样的结果:

< PatientInfo> <姓>富< /姓> <生日> 2015 - 12-19T16:21:48.4009949 + 01:00 < /生日> < RequestedClientID> 00000000-0000-0000-0000-000000000000 </RequestedClientID> 00000000-0000-0000-0000-000000000000 </patientId> </PatientInfo>

相关问题