Мне было интересно, сталкивался ли кто-нибудь с проблемой Stream.Write (), когда он работает в среде dev (Windows 7), но не работает в среде сервера (Windows 2008 R2 Enterprise)?
I 'Я в основном работаю с некоторым сторонним кодом, который читает из FileStream и записывает в запрос Http, ничего необычного, и он делает следующее:
Обеспечение того, что Response.KeepAlive является ложным (изначально было верно, но работало W7 ине W2K8 так пробовал ложь, но это не помогает);Обеспечение того, чтобы запись включала длину байтов для записи;После этого я очищаю поток;
Ошибка, с которой я сталкиваюсь, довольно расплывчата: «Запрос был прерван: запрос был отменен».с InnerException на «Невозможно закрыть поток, пока не будут записаны все байты».Теперь мой код отлично работает под Windows 7, поэтому я все еще подозреваю, что что-то активно блокирует эту запись, хотя я не уверен, что, как и где.
Еще одна возможность, которая меня интересовала, заключалась в том, может ли кодировка в Windows Server 2008 R2 отличаться от Windows 7?
Вот фрагмент кода из соответствующего метода (немного запутанный, но,отказ от ответственности, я не написал это: -):
string boundary = string.Concat("-------------------------", DateTime.Now.Ticks.ToString("x", CultureInfo.InvariantCulture));
byte[] boundaryBytes = System.Text.Encoding.UTF8.GetBytes(string.Concat("\r\n--", boundary, "\r\n"));
byte[] endBoundaryBytes = System.Text.Encoding.UTF8.GetBytes(string.Concat("\r\n--", boundary, "--\r\n"));
List<byte> requestData = new List<byte>();
requestData.AddRange(boundaryBytes);
requestData.AddRange(System.Text.Encoding.UTF8.GetBytes(string.Format(CultureInfo.InvariantCulture, "Content-Disposition: form-data; name=\"key\"\r\n\r\n{0}", this.ApiKey)));
if (methodAttribute.IsSessionRequired)
{
requestData.AddRange(boundaryBytes);
requestData.AddRange(System.Text.Encoding.UTF8.GetBytes(string.Format(CultureInfo.InvariantCulture, "Content-Disposition: form-data; name=\"sessionid\"\r\n\r\n{0}", this.SessionId)));
}
if (endPoint != null && !string.IsNullOrEmpty(endPoint.Token))
{
requestData.AddRange(boundaryBytes);
requestData.AddRange(System.Text.Encoding.UTF8.GetBytes(string.Format(CultureInfo.InvariantCulture, "Content-Disposition: form-data; name=\"token\"\r\n\r\n{0}", endPoint.Token)));
}
if (parameters != null && parameters.Keys.Count > 0)
{
foreach (string key in parameters.Keys)
{
string queryData = string.Format(CultureInfo.InvariantCulture, "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}", key, parameters[key]);
requestData.AddRange(boundaryBytes);
requestData.AddRange(System.Text.Encoding.UTF8.GetBytes(queryData));
}
}
long fileSize = endBoundaryBytes.Length;
if (fileStream != null)
{
string mimeType = StaticHelperFunctions.GetMimeType(fileStream);
fileStream.Position = 0;
if (string.IsNullOrEmpty(fileName))
{
fileName = DateTime.Now.Ticks.ToString("x", CultureInfo.InvariantCulture);
}
requestData.AddRange(boundaryBytes);
requestData.AddRange(System.Text.Encoding.UTF8.GetBytes(string.Format(CultureInfo.InvariantCulture, "Content-Disposition: form-data; name=\"file\"; filename=\"{0}\"\r\nContent-Type: {1}\r\n\r\n", fileName, mimeType)));
fileSize += fileStream.Length;
}
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestPath.ToString());
request.Method = "POST";
request.ContentType = string.Concat("multipart/form-data; boundary=", boundary);
request.UserAgent = string.Concat("Microsoft .NET, ", this.GetType().Assembly.FullName);
request.AllowWriteStreamBuffering = false;
request.Accept = "text/xml";
request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
request.KeepAlive = false;
request.Timeout = int.MaxValue;
request.ReadWriteTimeout = int.MaxValue;
request.ContentLength = requestData.Count + fileSize;
bool isCancel = false;
using (Stream requestStream = request.GetRequestStream())
{
requestStream.Write(requestData.ToArray(), 0, requestData.Count);
requestStream.Flush();
if (fileStream != null)
{
byte[] buffer = new byte[32768];
int bytesRead = 0;
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
{
requestStream.Write(buffer, 0, bytesRead);
requestStream.Flush();
if (this.Uploading != null)
{
ThirdPartyEventArgs uploadEventArgs =
new ThirdPartyEventArgs(
typeof(ContractType),
fileStream.Length,
fileStream.Position);
this.Uploading(this, uploadEventArgs);
if (uploadEventArgs.Cancel)
{
isCancel = true;
request.Abort();
break;
}
}
}
}
if (!isCancel)
{
requestStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length);
requestStream.Flush();
}
}