से सभी बाइट्स नहीं पढ़ता है मेरे पास एक वेबसाइट है जो मेरी वेबसाइट पर एक एएसपी.Net वेब एपीआई स्थापित है जिसका उपयोग WPF डेस्कटॉप एप्लिकेशन के साथ संवाद करने के लिए किया जाता है। मेरे पास क्लाइंट एप्लिकेशन से बाइनरी फाइलें प्राप्त करने के लिए एपीआई पर एक एक्शन सेटअप है। हालांकि कुछ (प्रतीत होता है यादृच्छिक) मामलों में जब मुझे अनुरोध से सभी बाइट मिलते हैं तो सभी बाइट पढ़े नहीं जाते हैं। उम्मीद है कि आप मुझे इस तरह से ऐसा करने का विचार दे सकते हैं कि हर समय काम करेगा।एएसपी.Net वेब एपीआई स्ट्रीमकंटेंट
क्लाइंट साइड: कोड यह
public static SubmitTurnResult SubmitTurn(int turnId, Stream fileStream)
{
HttpClient client = CreateHttpClient();
HttpContent content = new StreamContent(fileStream);
content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
content.Headers.ContentDisposition.FileName = "new-turn.Civ5Save";
content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
content.Headers.ContentLength = fileStream.Length;
HttpResponseMessage response = client.PostAsync(
string.Format("SubmitTurn?authKey={0}&turnId={1}",
LocalSettings.Instance.AuthenticationKey,
turnId
),
content
).Result;
response.EnsureSuccessStatusCode();
return response.Content.ReadAsAsync<SubmitTurnResult>().Result;
}
SubmitTurnResult एक enum कि सर्वर पर परिणाम को परिभाषित करता है, turnId इकाई इस फ़ाइल से जुड़ा हुआ है के लिए आईडी है, और फ़ाइलस्ट्रीम एक वास्तविक फ़ाइलस्ट्रीम डिस्क के बाइट्स को पढ़ रहा है।
सर्वर साइड:
[HttpGet, HttpPost]
public SubmitTurnResult SubmitTurn(string authKey, int turnId)
{
try
{
bool worked = false;
int gameId = 0;
using (GmrEntities gmrDb = new GmrEntities())
{
var player = gmrDb.Users.FirstOrDefault(u => u.AuthKey == authKey);
if (player != null)
{
var turn = player.Turns.FirstOrDefault(t => t.TurnID == turnId);
if (turn != null)
{
byte[] saveFileBytes = null;
using (MemoryStream tempStream = new MemoryStream())
{
var task = this.Request.Content.CopyToAsync(tempStream);
task.Wait();
saveFileBytes = tempStream.ToArray();
tempStream.Close();
}
if (saveFileBytes.Length != this.Request.Content.Headers.ContentLength.Value)
{
throw new Exception(string.Format("Byte array length ({0}) not equal to HTTP content-length header ({1}). This is not good!",
saveFileBytes.Length, this.Request.Content.Headers.ContentLength.Value));
}
worked = GameManager.SubmitTurn(turn, saveFileBytes, gmrDb);
if (worked)
{
gameId = turn.Game.GameID;
gmrDb.SaveChanges();
}
}
}
}
return SubmitTurnResult.OK;
}
catch (Exception exc)
{
DebugLogger.WriteExceptionWithComments(exc, string.Format("Diplomacy: Sumbitting turn for turnId: {0}", turnId));
return SubmitTurnResult.UnexpectedError;
}
}
क्या यह 32-बिट विंडोज सर्वर 2003 या विंडोज एक्सपी पर था? हम StreamContent के साथ इसी व्यवहार में भाग रहे हैं, लेकिन जब Windows Server 2003 वेब API सेवा से प्रतिक्रिया स्ट्रीम करते हैं। यह 2008 में repro नहीं करता है। साथ ही, हमने पाया है कि यह केवल एक फ़ाइलस्ट्रीम के साथ repros। फ़ाइलस्ट्रीम को मेमोरीस्ट्रीम में कनवर्ट करना समस्या को छोड़ देता है (पाठ्यक्रम की स्मृति के खर्च पर)। हमने पाया है कि जब प्रतिक्रिया धारा जल्दी समाप्त हो जाती है, तो यह हमेशा 4096-बाइट सीमा पर होती है, और यह लगभग 3.5 एमबी पर कैप हिट करती है। –