2013-01-11 19 views
5

Tôi đã không chắc chắn chính xác làm thế nào để yêu cầu này vì vậy tôi đã thực hiện một SSCCEdịch vụ WCF đơn giản, không phải tất cả các thông số từ khách hàng làm thông qua các dịch vụ

tôi có dịch vụ WCF đơn giản này

[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; } 
} 

và Tôi đang cố gắng để có được một khách hàng Winforms để gọi phương thức webservice; đây là những gì tôi có

string URI = " http://localhost:59961/EmailService/SendEmail"; 
string fileContents = Convert.ToBase64String(File.ReadAllBytes("test.txt")); 

EmailData emailData = new EmailData 
          { 
           EmailAddress = "[email protected]", 
           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); 
} 

bây giờ ở phía bên dịch vụ, một số thuộc tính không được hiển thị trong ảnh chụp màn hình sau. enter image description here

Tại sao số FileName có giá trị phù hợp nhưng những giá trị khác thì không?

+1

+1 cho link SSCCE :) –

+0

làm tập tin của bạn có chứa bất kỳ ký tự không hợp lệ cho xml giá trị? bạn đã cố mã hóa chúng chưa? –

+0

@Maras là một tệp văn bản siêu đơn giản (chỉ có một từ). Tôi cũng đã thử gửi một chuỗi bình thường thay vì chuỗi base64 và điều đó cũng không giúp được gì. –

Trả lời

3

Thứ tự của các phần tử XML là quan trọng khi deserialization. Theo mặc định, thứ tự là chữ cái, vì vậy bạn nên gửi trước tiên EmailAddress, sau đó Enc64FileContents, sau đó FileName. Hoặc một cách khác là để thiết lập Order tài sản trong các thuộc tính [DataMember], như trong thực sự đang SSCCE dưới đây :)

public class StackOverflow_14281800 
{ 
    [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 
      { 
       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 = "[email protected]", 
      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 + "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, "POST", xml); 
      Console.WriteLine(response); 
     } 
    } 
} 
+0

Cảm ơn! Tôi sắp xếp lại các phần tử XML và làm việc. –

+0

+1 câu trả lời tuyệt vời. Tôi tự hỏi nguyên nhân của việc này là gì. Tôi không biết thứ tự chữ cái sẽ là một yếu tố. –

Các vấn đề liên quan