我不确定如何问这个,所以我做了
SSCCE
我有这个简单的WCF服务
[ServiceContract] [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] public class EmailService { [WebInvoke(UriTemplate = "/SendEmail",Method = "POST",ResponseFormat = Webmessageformat.Json,RequestFormat = Webmessageformat.Xml)] public bool SendEmail(EmailData data) { try { byte[] fileBinaryContents = Convert.FromBase64String(data.Enc64FileContents); File.WriteallBytes(data.FileName,fileBinaryContents); return true; } catch (Exception) { return false; } } } [DataContract(Namespace = "http://somenamespace/")] public class EmailData { [DataMember] public string FileName { get; set; } [DataMember] public string EmailAddress { get; set; } [DataMember] public string Enc64FileContents { get; set; } }
我正在尝试让Winforms客户端调用webservice方法;这就是我所拥有的
string URI = " http://localhost:59961/EmailService/SendEmail"; string fileContents = Convert.ToBase64String(File.ReadAllBytes("test.txt")); EmailData emailData = new EmailData { EmailAddress = "foo@bar.com",Enc64FileContents = fileContents,FileName = "test.txt" }; XNamespace ns = "http://somenamespace/"; XElement emailDataElement = new XElement(ns + "EmailData"); emailDataElement.Add(new XElement(ns + "FileName",emailData.FileName)); emailDataElement.Add(new XElement(ns + "Enc64FileContents",emailData.Enc64FileContents)); emailDataElement.Add(new XElement(ns + "EmailAddress",emailData.EmailAddress)); var xml = emailDataElement.ToString(SaveOptions.disableFormatting); using (WebClient wc = new WebClient()) { wc.Headers[HttpRequestHeader.ContentType] = "application/xml; charset=utf-8"; string response = wc.UploadString(URI,"POST",xml); }
现在在服务端,一些属性为null,如下面的屏幕截图所示.
为什么FileName具有正确的值而其他人没有?
解决方法
反序列化时,XML元素的顺序很重要.默认情况下,订单是按字母顺序排列的,因此您应首先发送EmailAddress,然后发送Enc64FileContents,然后发送FileName.或者另一种方法是在[DataMember]属性中设置Order属性,如下面真正的SSCCE代码:)
public class StackOverflow_14281800 { [ServiceContract] [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] public class EmailService { [WebInvoke(UriTemplate = "/SendEmail",RequestFormat = Webmessageformat.Xml)] public bool SendEmail(EmailData data) { try { Console.WriteLine("data.FileName = " + data.FileName); Console.WriteLine("data.EmailAddress = " + data.EmailAddress); Console.WriteLine("data.FileContents = " + new string(Convert.FromBase64String(data.Enc64FileContents).Select(b => (char)b).ToArray())); //byte[] fileBinaryContents = Convert.FromBase64String(data.Enc64FileContents); //File.WriteallBytes(data.FileName,fileBinaryContents); return true; } catch (Exception) { return false; } } } [DataContract(Name = "EmailData",Namespace = "http://somenamespace/")] public class EmailData { [DataMember(Order = 1)] public string FileName { get; set; } [DataMember(Order = 2)] public string EmailAddress { get; set; } [DataMember(Order = 3)] public string Enc64FileContents { get; set; } } public static void test() { string baseURI = "http://localhost:59961/EmailService"; var host = new WebServiceHost(typeof(EmailService),new Uri(baseURI)); host.open(); Console.WriteLine("Host opened"); string URI = baseURI + "/SendEmail"; //string fileContents = Convert.ToBase64String(File.ReadAllBytes("test.txt")); string fileContents = Convert.ToBase64String("hello world".Select(c => (byte)c).ToArray()); EmailData emailData = new EmailData { EmailAddress = "foo@bar.com",FileName = "test.txt" }; XNamespace ns = "http://somenamespace/"; XElement emailDataElement = new XElement(ns + "EmailData"); emailDataElement.Add(new XElement(ns + "FileName",emailData.FileName)); emailDataElement.Add(new XElement(ns + "EmailAddress",emailData.EmailAddress)); emailDataElement.Add(new XElement(ns + "Enc64FileContents",emailData.Enc64FileContents)); var xml = emailDataElement.ToString(SaveOptions.disableFormatting); using (WebClient wc = new WebClient()) { wc.Headers[HttpRequestHeader.ContentType] = "application/xml; charset=utf-8"; string response = wc.UploadString(URI,xml); Console.WriteLine(response); } } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。