WCF下载文件控制

时间:2011-01-31 21:29:05

标签: .net wcf file-transfer

我正在编写一个控制客户端下载的应用程序,我需要知道下载成功的时间,但我需要在服务器端执行此操作,但我找不到类似的内容。

这是我的服务器代码:

    public GetCoverResponse GetCover(GetCoverRequest request)
    {
        return new GetCoverResponse()
        {
            Cover = downloadsManagementService.GetCover(request.IssueId)
        };
    }

[MessageContract]
public class GetCoverResponse: IDisposable
{
    [MessageBodyMember(Order=1)]
    public Stream Cover;

    public void Dispose()
    {
        if (Cover != null)
        {
            Cover.Close();
            Cover = null;
        }
    }
}

GetCover返回一个Stream。 我正在使用此配置:

<basicHttpBinding>
    <binding name="StreamedBindingConfiguration" messageEncoding="Mtom" maxBufferSize="65536"
                 transferMode="Streamed">
    </binding>
</basicHttpBinding>

客户端代码是:

 static void Main(string[] args)
 {
        var client = new DownloadsService.DownloadsServiceClient();
        var data = client.GetCover(1);
        FileStream f = new FileStream(@"D:\copiaDDDDDDD.txt", FileMode.OpenOrCreate);
        Copy(data, f);
        f.Close();
        data.Close();
        client.Close();
}

 public static void Copy(Stream source, Stream target)
 {
        byte[] buffer = new byte[65536];
        int bytes;
        try
        {
            while ((bytes = source.Read(buffer, 0, buffer.Length)) > 0)
            {
                target.Write(buffer, 0, bytes);
            }
        }
        finally
        {
            target.Flush();
        }
    }

我需要知道客户端下载何时成功,而无需再次调用该服务。

2 个答案:

答案 0 :(得分:0)

他们如何下载文件?使用您的WCF服务?如果是这样,你必须将内容流式传输到它们,所以只需确定流读取已结束然后做你需要做的任何事情。

答案 1 :(得分:0)

您无法知道下载何时成功。您只能知道服务何时发送了所有数据。

了解客户端是否已收到所有数据的唯一方法是让客户告诉服务它已收到所有数据。