gpt4 book ai didi

wcf - 委托(delegate)和 WCF 方法

转载 作者:行者123 更新时间:2023-12-05 00:42:55 25 4
gpt4 key购买 nike

我已经成功设计了一个使用 WCF 的大文件上传方法。
现在,我想报告正在加载的每个唯一文件的进度。
在我的上传方法中,我有以下代码块:

while ((bytesRead = request.FileByteStream.Read(buffer, 0, bufferSize)) > 0)
{
outfile.Write(buffer, 0, bytesRead);
totalBytesRead += bytesRead;

if (this.ProgressChanged != null)
this.ProgressChanged(this, new ProgressArgs(totalBytesRead, request.FileByteStream.Length));

}

它使用如下声明的 deleget ProgressEventHandler:
public delegate void ProgressEventHandler(object sender, ProgressArgs e);
public event ProgressEventHandler ProgressChanged;

我不太使用委托(delegate)(但我正在努力学习)并且已经做到了这一点
下面是网上的例子。示例中缺少 ProgressArgs 类,但是
我猜那是计算发生并返回的地方?某物
喜欢: return Convert.ToInt32((totalBytesRead * 100) / fileSize) ?

所以,我的问题是:

1) 假设我已经正确声明并调用了我的 ProgressChanged 事件, 我该怎么办
使用 ProgressArgs
?

2) 如何向客户报告进度 ?我的 WCF 方法调用当前具有“void”返回类型:

upload.UploadFile(fileinfo, m_objFile.InputStream);

我是否需要同时触发调用 WCF JSON 方法或类似性质的 JavaScript 方法?非常感谢您详细解释如何查看客户的进度。

谢谢!

PS - 我正在使用 ASP.NET 2.0/Framework 3.5/C#/我目前是自托管的。

最佳答案

哇,您在一个问题中询问了很多不同的层次。

回调,而不是事件

您正在尝试做一些特定于 .NET 且不直接映射到 Web 服务编程的事情。您不能在 Web 服务中使用事件/委托(delegate)。相反,您必须定义所谓的“回调契约(Contract)”。这是另一个接口(interface),上面有方法,表示您想告诉调用者的通知,并应用于您的服务契约(Contract),如下所示:

public interface MyCallbackContract
{
void ProgressChanged(float percentComplete);
}

[ServiceContract(CallbackContract = typeof(MyCallbackContract)]
public interface MyServiceContract
{
void UploadFile(Stream stream);
}

现在,回调合约需要双向(双工)通信,所以如果你只是使用 basicHttpBinding现在,您需要切换到使用 wsDualHttpBinding或者完全是一些非 http 绑定(bind),这会将该服务的互操作性从水中吹走。假设您的服务完全是 Intranet,那么这不应该是一个阻碍。

还有很多关于回调编程模型的知识,我不会在这里介绍。相反,我会推荐你​​到 an awesome MSDN article by Juval Lowey它非常详细地涵盖了该主题。

这对浏览器有什么帮助?

您问题的第二部分是如何从浏览器获取这些信息,首先我们必须接受它绝对不可能直接与上述服务通信。相反,您需要构建一个 AJAX“桥”服务。由于这里的浏览器是纯 HTTP,因此您必须使用 POST 将文件上传到基于 REST 的 WCF 服务。如果您想同时检索有关该上传的状态,则必须发出轮询请求以获取状态。

老实说,这是浏览器作为一个平台仍然很糟糕的地方之一。浏览器知道它发送了多少数据,您应该能够仅基于此报告进度,但它不会暴露在任何地方。这就是人们转向使用基于 Flash 的上传实用程序的原因,因为 Flash 确实公开了这些详细信息,因此您无需轮询服务器即可获得进度。

关于wcf - 委托(delegate)和 WCF 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1675966/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com