如何在不读取其完整内容的情况下中止HTTP帖子(.NET REST服务)

时间:2012-04-23 13:53:56

标签: .net wcf rest post httpwebrequest

我创建了一个自托管的.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 个答案:

答案 0 :(得分:4)

如果我理解你正面对的问题..

客户端调用方法

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

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

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

这样可以解决你的问题。

答案 1 :(得分:0)

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

所以你唯一的选择是:

1)由编写者自己做一个二进制文件上传处理程序(httpHandler)。并非不可能,但并不像初看起来那样微不足道。这将涉及确定请求编码方法并使用适当的技术进行可能的变化以正确地解码流中的编码二进制数据。

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

答案 2 :(得分:-1)

可能,只返回带错误代码的响应,不要流文件

答案 3 :(得分:-2)

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