【发布时间】:2014-08-21 10:20:03
【问题描述】:
我有一个 Windows 服务,它正在将文件上传到正在处理它们的其他网站。问题是,对于小文件,它可以正常工作并且从那里得到响应,但是对于大文件(大约需要 6 分钟的处理时间),它会永远处于等待模式。
这是外部网站发布方法代码的一部分:
try
{
...
LogResults();
return string.Empty;
}
catch (Exception e)
{
return e.Message;
}
问题是我甚至可以看到大文件的日志,所以这意味着网站总是返回值,但对于大文件,我的 Windows 服务不会等待它们。
这是来自 Windows 服务的代码
var valuesp = new NameValueCollection
{
{ "AccountId", datafeed.AccountId }
};
byte[] resultp = UploadHelper.UploadFiles(url, uploadFiles, valuesp);
response = Encoding.Default.GetString(resultp);
UploadFiles 方法为小文件返回值,但对于大文件永远等待。
这是 UploadFiles 的完整代码
public static byte[] UploadFiles(string address, IEnumerable<UploadFile> files, NameValueCollection values)
{
var request = WebRequest.Create(address);
request.Timeout = System.Threading.Timeout.Infinite; //3600000; // 60 minutes
request.Method = "POST";
var boundary = "---------------------------" +
DateTime.Now.Ticks.ToString("x", NumberFormatInfo.InvariantInfo);
request.ContentType = "multipart/form-data; boundary=" + boundary;
boundary = "--" + boundary;
using (var requestStream = request.GetRequestStream())
{
// Write the values
if (values != null)
{
foreach (string name in values.Keys)
{
var buffer = Encoding.ASCII.GetBytes(boundary + Environment.NewLine);
requestStream.Write(buffer, 0, buffer.Length);
buffer =
Encoding.ASCII.GetBytes(string.Format("Content-Disposition: form-data; name=\"{0}\"{1}{1}", name,
Environment.NewLine));
requestStream.Write(buffer, 0, buffer.Length);
buffer = Encoding.UTF8.GetBytes(values[name] + Environment.NewLine);
requestStream.Write(buffer, 0, buffer.Length);
}
}
// Write the files
if (files != null)
{
foreach (var file in files)
{
var buffer = Encoding.ASCII.GetBytes(boundary + Environment.NewLine);
requestStream.Write(buffer, 0, buffer.Length);
buffer =
Encoding.UTF8.GetBytes(
string.Format("Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"{2}", file.Name,
file.Filename, Environment.NewLine));
requestStream.Write(buffer, 0, buffer.Length);
buffer =
Encoding.ASCII.GetBytes(string.Format("Content-Type: {0}{1}{1}", file.ContentType,
Environment.NewLine));
requestStream.Write(buffer, 0, buffer.Length);
requestStream.Write(file.Stream, 0, file.Stream.Length);
buffer = Encoding.ASCII.GetBytes(Environment.NewLine);
requestStream.Write(buffer, 0, buffer.Length);
}
}
var boundaryBuffer = Encoding.ASCII.GetBytes(boundary + "--");
requestStream.Write(boundaryBuffer, 0, boundaryBuffer.Length);
}
using (var response = request.GetResponse())
using (var responseStream = response.GetResponseStream())
using (var stream = new MemoryStream())
{
responseStream.CopyTo(stream);
return stream.ToArray();
}
}
我在这里做错了什么?
编辑:在本地它甚至可以处理 7-8 分钟。但在现场环境中没有。它可以与主应用程序 IIS 设置相关吗?会不会和windows服务服务器设置有关?
编辑 2: 远程服务器 web.config httpRuntime 设置
<httpRuntime enableVersionHeader="false" maxRequestLength="300000" executionTimeout="12000" targetFramework="4.5" />
【问题讨论】:
-
我看不到任何明显的东西,但值得注意的是,仅仅因为您的 Web 层收到了请求,并不意味着您的客户端收到了响应。如果是我,我会得到一份 Fiddler 的副本,然后只观察 HTTP 流量来回移动,看看您是否可以确定响应是从 Web 服务器返回的(并且没有被 .net 发现)或者响应的位置永远不会从 Web 服务器返回。希望更敏锐的眼睛会发现代码问题,但 Fiddler 将是我的第一个诊断。
-
如果你使用
StreamReader而不是将流复制到内存流会发生什么?像这样:StreamReader reader = new StreamReader(responseStream); string responseFromServer = reader.ReadToEnd(); -
相同的结果...实际上响应是非常小的字符串,所以我不认为 MemoryStream 是问题。
-
小编辑已添加到问题中。
-
我在发布服务端看不到任何错误处理。如果
using (var response = request.GetResponse())抛出异常(例如超时)会发生什么?你会在某个地方看到它吗?我想要的是,您真的确定服务实际上是在等待响应吗?
标签: c# .net request response webrequest