使用Duplex WCF服务调用结果更新ASP.NET页面

时间:2012-03-28 18:32:21

标签: c# asp.net wcf

我在设计从ASP.NET应用程序调用双工WCF服务的最佳方法时遇到问题我有以下情况:

1)我有一些具有一些操作的双工WCF服务 2)从ASP.NET Web应用程序(我的客户端),我使默认页面实现回调接口,然后从双工服务调用一个方法发送自己作为回调的处理程序
3)default.aspx页面上的回调返回时,我无法在页面上显示结果,因为整个HttpContext为空,因此我无法访问任何控件或Application []或Session []变量

以下是Default.aspx中的代码

[CallbackBehavior(UseSynchronizationContext = false)]
public partial class _Default : System.Web.UI.Page, VehicleTrackingService.IDuplexServiceCallback
{
    public _Default()
    {

    }
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        ThreadPool.QueueUserWorkItem(new WaitCallback(delegate
        {
            try
            {

                DuplexService client = new DuplexServiceClient(new InstanceContext(new_Default()));
                switch (DropDownList1.SelectedItem.Value)
                {
                    case "0":
                        {
                            client.Method1(int.Parse(txt_name.Text));
                            break;
                        }
                    case "1":
                        {
                            lbl_res.Text = "Not Provided yet.";
                            break;
                        }
                    default:
                        {
                            lbl_res.Text = "Not Provided yet.";
                            break;
                        }
                }
            }
            catch(Exception ex)
            {
            }
        }));
    }

   public void DuplexCallbackFunction(string response)
    {
        // Wanna to show result (the response) from here ...
    }

请帮助吗?

2 个答案:

答案 0 :(得分:0)

在服务器上处理页面时,您正在从ASP.Net页面调用WCF服务。

这个问题是页面在服务器上的时间非常短,不到一秒钟。然后,在WCF服务响应之前,页面已返回到浏览器。

正如Lloyd所说,修复此问题的方法是使用AJAX从浏览器调用Web服务。

有关如何执行此操作的一个示例,请参阅http://www.codeproject.com/Articles/128478/Consuming-WCF-REST-Services-Using-jQuery-AJAX-Call

答案 1 :(得分:0)

您必须记住,您的应用程序由作为服务器访问ASP.NET应用程序的浏览器客户端组成,并且这两者通过HTTP请求和响应进行通信。在WCF服务将消息发送回ASP.NET应用程序之前,您的ASP.NET应用程序很可能已将HTTP响应发送回浏览器。

我认为西拉和劳埃德提出了一个很好的建议;尝试直接从浏览器调用WCF服务。 This answer表明可以使用JavaScript与WCF服务进行双工通信。

但是,可能存在多种原因导致您无法执行此操作,例如凭据,网络防火墙规则或仅仅是ASP.NET应用程序具有调用WCF服务所需的数据这一事实,也许你不想将这些数据暴露给浏览器。

在这些情况下,您可以选择实施复杂的解决方案,这些解决方案涉及在浏览器中使用JavaScript来轮询ASP.NET服务器以获取更新。有几种方法可以做到这一点。有“短轮询”和“长轮询”。还有一个名为WebSockets的相对较新的功能,但是您的服务器和目标浏览器是否支持WebSockets是另一个问题。