5

我创建了一个接受二进制上传的自托管 .NET 服务。

[ServiceContract]
public interface IBinaryService
{

    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "up/file/{fileName}/{hash}")]

    void FileUpload(string fileName, string hash, Stream fileStream);

当它接收到一个文件时,它首先检查该文件是否已经在系统上,否则它从客户端流式传输文件并保存它:

    public void FileUpload(string fileName, string hash, Stream fileStream)
    {
        string filebasedir = basedir + @"file\"; //" 
        if (File.Exists(filebasedir + hash))
        {

            WebOperationContext.Current.OutgoingResponse.StatusCode = 
                                   System.Net.HttpStatusCode.Conflict;
            return;
        }

        using(var fileToupload = new FileStream(
                string.Concat(filebasedir, hash),
                FileMode.Create))
                {
                fileStream.CopyTo(fileToupload);
                }

如果我单步执行代码,我可以看到在服务器读取参数并确定是否存在冲突之后,文件内容才会流式传输。我只需要以某种方式强制服务器不读取全部内容(可能是很多兆字节)。不幸的是,使用“return”提前退出该方法并不会这样做。

这可能吗?

4

4 回答 4

4

如果我理解你所面临的问题正确..

客户端调用方法

void FileUpload(string fileName, string hash, Stream fileStream);

一旦调用该函数,它就会开始将文件上传到服务器。如果服务器上已经存在文件,您希望避免或中断文件上传。

你为什么不把你的方法一分为二,一种方法会检查服务器上是否已经存在文件(它只有两个参数 filename 和 hash,不要传递 filestream ),并返回 true 或 false,如果它不存在然后使用 filestream 参数调用第二种方法。

这样它应该可以解决你的问题。

于 2012-05-03T07:40:37.670 回答
0

框架中的内置功能(服务器端文件上传控件)没有提供更精细的粒度来处理在上传过程中以块形式接收的数据。它只是缓冲内存中的所有数据,直到到达文件末尾或遇到错误情况。

因此,您唯一的选择是:

1)通过编写二进制文件上传处理程序(httpHandler)自己完成。并非不可能,但也没有乍看起来那么微不足道。这将涉及确定请求编码方法并针对可能的变化使用适当的技术来正确解码流中的编码二进制数据。

2) 一个更简单的解决方案是只使用现有的商业控件之一,它为您实现此功能并公开您可以用来驱动自己的代码的事件。例如,以ABCUpload.NET为例。另一个是PowUpload

于 2012-05-02T22:26:50.200 回答
-1

可能,只返回带有错误代码的响应,而不是流式传输文件

于 2012-04-24T21:01:27.753 回答
-2

你可以使用OperationContext.Current.RequestContext.Abort()方法。

于 2016-01-21T13:04:53.247 回答