如何开发用于上传具有状态的文件的Web服务(ASMX)

时间:2012-11-26 08:18:39

标签: c# web-services asmx

在Web服务的帮助下将文件上传到Web服务器很容易。这是我一般的方式。这是我的示例代码。

[WebMethod]
public bool UploadFile(string FileName, byte[] buffer, long Offset)
{
bool retVal = false;
try
{
// setting the file location to be saved in the server. 
// reading from the web.config file 
string FilePath = 
Path.Combine(ConfigurationManager.AppSettings["upload_path"], FileName);

if (Offset == 0) // new file, create an empty file
File.Create(FilePath).Close();
// open a file stream and write the buffer. 
// Don't open with FileMode.Append because the transfer may wish to 
// start a different point
using (FileStream fs = new FileStream(FilePath, FileMode.Open, 
FileAccess.ReadWrite, FileShare.Read))
{
fs.Seek(Offset, SeekOrigin.Begin);
fs.Write(buffer, 0, buffer.Length);
}
retVal = true;
}
catch (Exception ex)
{
//sending error to an email id
common.SendError(ex);
}
return retVal;
}

但是我想开发一个Web服务,它将以百分比的形式提供上传文件的状态,当文件上传完成时,将在客户端触发一个事件,其中包含文件是否完全上传的状态消息。我还需要编写可以同时处理多个请求的例程,并且例程必须是线程安全的。所以请指导我如何设计足以满足我所有要求的例行程序。感谢

1 个答案:

答案 0 :(得分:2)

我强烈建议您忘记从头开始实现这一点,而是考虑一下现有的客户端文件上传解决方案 - 大多数都带有一些可以插入现有应用程序的样板.NET代码。

我使用了jQuery Upload和plUpload,它们都有可靠的客户端上传管理器,可以通过HTTP Range标头上传文件,并在此过程中提供上传状态信息。我相信两者都带有.NET示例。

为这些类型的上传处理程序实现服务器端涉及接收HTTP数据块,这些数据块是通过某种上传会话ID识别的。客户端发送文件块,每个文件由此文件相关的id标识,以及一些进度信息,如传输的字节数和总文件大小以及显示请求状态的状态值。状态会让您知道文件何时完全上传。

然后,可以根据从客户端传递的唯一ID将POST缓冲区中的传入数据写入文件或数据库或其他存储机制。由于客户端应用程序正在向服务器发送数据块,因此它可以提供进度信息。如果您使用像plUpload或jQuery-Upload这样的客户端库,他们将提供可自定义的UI。