【问题标题】:WCF Service- Sending back object to calling AppWCF 服务 - 将对象发送回调用 App
【发布时间】:2011-03-03 06:22:00
【问题描述】:

我的 WCF 服务(托管为 Windows 服务)有一些“SendEmail”方法,在进行一些处理后发送电子邮件。

现在,我有另一个要求,客户希望在发送电子邮件之前预览它们,因此我的 WCF 服务需要将整个电子邮件对象返回给调用 Web 应用程序。 如果客户对 emails 对象感到满意,他们可以简单地点击“Send out”,然后再次调用 WCF 服务来发送电子邮件。

因为有时处理电子邮件对象可能需要更长的时间,我不希望调用应用程序等到电子邮件对象准备好。

谁能指导我需要对我的 WCF 服务(目前具有单向操作)进行哪些更改?

另外,请指导我是否需要进行异步操作或消息队列或者可能是双工合同?

谢谢!

【问题讨论】:

    标签: wcf


    【解决方案1】:

    根据您的描述,我认为您必须:

    • 将当前操作从发送电子邮件更改为存储电子邮件(可能在数据库中)。
    • 添加额外操作以检索当前用户准备好的电子邮件
    • 添加其他方法以确认发送一封或多封电子邮件并将其从存储中删除。

    流程如下:

    1. 用户将触发一些 http 请求,这将导致调用您的 WCF 服务进行处理(第一次操作)
    2. WCF 服务将启动一些处理(异步或首次操作将是单向的,因此客户端不必等待)。
    3. 处理将以某种方式保存电子邮件
    4. 根据处理的持续时间,您可以使用 AJAX 轮询 WebApp,WebApp 反过来轮询 WCF 服务以获取准备好的电子邮件,或者您将创建单独的页面,用户必须访问该页面才能查看准备好的电子邮件。两种方法都使用第二次操作。
    5. 用户将检查准备好的电子邮件并触发 http 请求,这将导致调用第三个操作来发送这些电子邮件。

    【讨论】:

    • 谢谢拉迪斯拉夫,是的,它应该是这样工作的。一个查询,如果我对数据库部分进行排队/保存请求,我该如何启动一个异步方法,以便报告服务从队列中获取第一个请求来处理,我应该为此启动一个新线程吗?
    • 这是否意味着您希望在任何给定时间只处理单个请求?
    • 是的,这么想。因为一旦请求被保存到数据库或排队,客户端可以愉快地继续处理其他事情......所以服务应该从队列中获取第一个未处理的作业并开始处理它。我应该怎么做才能让我的服务从队列中挑选工作并开始处理?另外,顺便说一句,是否可以从队列中获取多个作业进行处理?
    • 这取决于你。您的 Windows 服务可以有后台线程,它会定期检查队列并根据需要处理尽可能多的请求。
    • hmm,您能否指导我如何将后台线程添加到当前的 wcf 服务以从 db 队列中获取一个或多个请求。或者您对添加另一个 wcf 服务来执行stackoverflow.com/questions/2106369/…中提到的后台任务有什么看法
    【解决方案2】:

    您有多种选择:

    • 使用拉迪斯拉夫的方法。仅添加该服务会返回一个令牌,然后客户端使用该令牌进行轮询,直到超时或成功响应。服务器还将这些临时电子邮件保留一段时间,并在超时后清除它们。
    • 使用双工通信,以便服务器也可以回调客户端,并在完成处理后这样做。 但不要这样做 - 这是my view 为什么不这样做。
    • 使用异步方法。你可以找到很好的信息here

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 2016-02-11
    相关资源
    最近更新 更多