2013-03-25 38 views
0

流屬性的類對象,我可以發送一個簡單的class object一些性質是這樣的:發送利用休息

[DataContract] 
public class DeviceInfo 
{ 
    [DataMember] 
    public string DeviceCode { get; set; } 

    [DataMember] 
    public string ClientKey { get; set; } 

    [DataMember] 
    [XmlIgnore] 
    public DateTime Timestamp { get; set; } 

    [DataMember] 
    public string Token { get; set; } 
} 

WindowsForm代碼:

string baseAddress = "http://some_webservice_url"; 
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(baseAddress); 
request.Method = "POST"; 
request.ContentType = "application/json"; 

DeviceInfo customData = new DeviceInfo(); 
customData.DeviceCode = "123456"; 
customData.ClientKey = "hfhf8djf89dfk9"; 
customData.Timestamp = "12-12-2013"; 
customData.Token = "444sdf54df544r"; 

byte[] byteArray = Encoding.UTF8.GetBytes(Serialize<DeviceInfo>(customData)); 
request.ContentLength = byteArray.Length; 
Stream dataStream = request.GetRequestStream(); 
dataStream.Write(byteArray, 0, byteArray.Length); 
dataStream.Close(); 

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
{ 
    MessageBox.Show(Utility.ReadResponse(response)); 
} 

// SERIALIZATION PART 

public static string Serialize<T>(T obj) 
{ 
    System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(obj.GetType()); 
    MemoryStream ms = new MemoryStream(); 
    serializer.WriteObject(ms, obj); 
    string retVal = Encoding.Default.GetString(ms.ToArray()); 
    ms.Dispose(); 

    return retVal; 
} 

public static byte[] ReadFully(Stream input) 
{ 
    byte[] buffer = new byte[16 * 1024]; 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     if (input != null) 
     { 
      int read; 
      while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 
      { 
       ms.Write(buffer, 0, read); 
      } 
     } 
     return ms.ToArray(); 
    } 
} 

它所做的是送DeviceInfo服務器。
我怎麼能做到這一點使用一個類的對象與Stream property

public class PhotoData 
{ 
    public string ProductId { get; set; } 
    public string PhotoId { get; set; } 
    public System.IO.Stream FileData { get; set; } 
} 

這是我迄今所做的,它拋出一個錯誤,說

Type 'System.IO.FileStream' with data contract name 'FileStream:http://schemas.datacontract.org/2004/07/System.IO' 
is not expected. Consider using a DataContractResolver or add any types not known statically to the list of 
known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types 
passed to DataContractSerializer. 

StreamReader sr = new StreamReader(openFileDialog1.FileName); 
byte[] fileStream = ReadFully(sr.BaseStream); 

PhotoData pd = new PhotoData(); 
pd.FileData = sr.BaseStream; 
pd.ProductId = "121513542454545"; 
pd.PhotoId = textBox4.Text; 

baseAddress = "http://someurl/rest/UploadPhotoStream"; 
request = (HttpWebRequest)WebRequest.Create(new Uri(baseAddress)); 
request.Method = "POST"; 
request.ContentType = "application/octet-stream"; 

byteArray = Encoding.UTF8.GetBytes(Serialize<PhotoData>(pd)); 
request.ContentLength = byteArray.Length; 
Stream dataStream2 = request.GetRequestStream(); 
dataStream2.Write(byteArray, 0, byteArray.Length); 
dataStream2.Close(); 

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
{ 
    MessageBox.Show(Utility.ReadResponse(response)); 
} 

回答

1

我建議使用一個byte[]而不是一個Stream

public class PhotoData 
{ 
    public string ProductId { get; set; } 
    public string PhotoId { get; set; } 
    public byte[] FileData { get; set; } 
} 

然後你就可以讀/以傳統的方式使用MemoryStream寫入FileData。我不完全確定你的方法試圖做什麼,但我認爲它最終會看起來有點像這樣:

byte[] fileStream = ReadFully(sr.BaseStream); 

PhotoData pd = new PhotoData(); 
pd.FileData = fileStream; 
+0

但我需要使用流。問題,如果其他房產如果有價值會發生什麼,他們會被包括在內?我問這個,因爲你只得到'byteArray.Length'這等於'pd.FileData' – fiberOptics 2013-03-25 05:59:51

+0

@fiberOptics是的,那部分不會改變。 – 2013-03-25 06:02:44

+0

所以如果我這樣做,這段代碼'byteArray = Encoding.UTF8.GetBytes(Serialize (pd));'不會再拋出錯誤了嗎?你如何在'request.GetRequestStream();'上寫PhotoData?''我真的不知道多少。謝謝 – fiberOptics 2013-03-25 06:12:38