我希望獲得關於將自定義對象從「REST」服務器傳輸到控制器的最佳方法的建議。簡而言之,我們在處理HttpGet
請求的服務器上運行MVC 4。最初,來自服務器的所有響應都可以通過將我們的自定義類序列化爲JSON,然後反序列化它們的客戶端大小來適應。但是,現在我們需要傳輸大量數據(即圖像),這種方法不再有效。如何從REST服務器向控制器傳輸大類類型
以下是我目前正在做的精簡版本,但我希望有更好的方式來傳輸大型文件(自定義類型)的一些建議。
類:
[Serializable]
public class TradingPost
{
public int TradingPostId { get; set; }
public string UserId { get; set; }
}
[Serializable]
public class TradingPostImage
{
public int TradingPostImageId { get; set; }
public string ImageName { get; set; }
public string ImageData { get; set; }
}
[Serializable]
public class TradingPostWithImages
{
public TradingPost Post { get; set; }
public List<TradingPostImage> Images { get; set; }
public TradingPostWithImages()
{
Post = new TradingPost();
Images = new List<TradingPostImage>();
}
}
服務器側控制器:
[HttpGet]
public ActionResult GetAllTradingPosts()
{
List<TradingPostWithImages> postsAndImages = PostRepository.GetAllPostsAndImages();
MemoryStream memoryStream = new MemoryStream();
BinaryFormatter binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize(memoryStream, postsAndImages);
var postsAsByteArray = memoryStream.ToArray();
return File(postsAsByteArray, "application/octet-stream");
}
客戶端控制器:
public List<TradingPostWithImages> GetItems()
{
var dataGatewayPath = GetGateWayPath("GetTradingPosts");
MemoryStream webData = new MemoryStream();
var Request = WebRequest.CreateHttp(dataGatewayPath);
var Response = Request.GetResponse() as HttpWebResponse;
if(Response != null)
{
DataStream = Response.GetResponseStream();
if(DataStream != null)
{
DataStream.CopyTo(webData);
DataStream.Close();
}
Response.Close();
}
webData.Position = 0;
BinaryFormatter formatter = new BinaryFormatter();
var activeItems = (List<TradingPostWithImages>)formatter.Deserialize(webData);
return activeItems;
}
這個工作,但有什麼辦法,我可以做到什麼,我以後沒有反序列化一個流,然後將其轉換爲我的自定義類型?是否有更好或更有效的方式來完成我的任務?
是的,只需堅持json/xml並讓您的REST服務器返回一個圖像編碼爲base64的對象。另外,不要在控制器上執行數據層邏輯:) – Sinaesthetic
或者我在這種情況下做的一般是在第一遍中返回帶有圖像標識符的對象列表,然後讓端點獲取圖像標識並檢索來自服務器的圖像並在事實(例如)之後加載它們,其中內容控制器上的圖像操作請求來自服務器的具有ID「abcd」的圖像。這會給你一個更快的初始響應,並允許圖像異步加載。這有點煩人,但在客戶端更好的表現。 – Sinaesthetic
@Sinaesthetic感謝您的反饋。對於非常大的圖像,您如何應對maxJsonLength問題?只需將值設得很高?呵呵,不用擔心控制器中的邏輯問題,這個例子是一個「精簡版」,我認爲這個版本更容易發佈。 – D0ubleGunz