none
Web客户端调用WCF服务后,回调返回结果不显示,请大家帮帮忙 RRS feed

  • 问题

  • 大家好

    我下载了微软的一个WCF示例,它用IIS承载WCF服务,采用双工回调技术,示例中客户端采用控制台应用程序.

    我把客户端改成WebForm应用程序后,回调结果显示不出来,但是在调试的时候有时可以得到和显示正确结果.

    下面我把Web客户端的前后台代码贴出来,另外提供整个源码下载.
    http://www.zhstrong.com/uploadfiles/cs.rar


    HTML code
    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
      <title></title>
    </head>
    <body>
      <form id="form1" runat="server">
      <asp:ScriptManager ID="ScriptManager1" runat="server">
      </asp:ScriptManager>
      <div>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
        <asp:TextBox ID="TextBox1" runat="server" Height="345px" TextMode="MultiLine"></asp:TextBox>
        <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
        <asp:Button ID="Button2" runat="server" onclick="Button2_Click" Text="Button" />
        <asp:Button ID="Button3" runat="server" onclick="Button3_Click" Text="Button" />
        <asp:Button ID="Button4" runat="server" onclick="Button4_Click" Text="Button" />
        </ContentTemplate>
        </asp:UpdatePanel>
      </div>
      
      </form>
    </body>
    </html>
    



    C# code
    using System;
    using System.Collections.Generic;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.ServiceModel;
    
    namespace WebApplication1
    {
      public partial class _Default : System.Web.UI.Page,WebClientTest.ICalculatorDuplexCallback
      {
        //WebClientTest为引用的WCF服务命名空间
        WebClientTest.CalculatorDuplexClient client;
        double value;
        protected void Page_Load(object sender, EventArgs e)
        {
          InstanceContext instanceContext = new InstanceContext(this);
          //每次执行Button事件,client都为空.
          // Create a client
          if (client == null)
          {
            //创建WCF服务的客户端
            client = new WebClientTest.CalculatorDuplexClient(instanceContext);
          }     
        }
    
        #region ICalculatorDuplexCallback 成员
        /// <summary>
        /// 实现回调成员
        /// </summary>
        /// <param name="result1"></param>
        public void Result(double result1)
        {
          this.TextBox1.Text += result1.ToString() + "\r\n";
          
        }
    
        public void Equation(string eqn)
        {
          this.TextBox1.Text += eqn + "\r\n";
        }
    
        #endregion
    
        protected void Button1_Click(object sender, EventArgs e)
        {
          // Call the AddTo service operation.
          //调用WCF服务
          value = 100.00D;
          client.AddTo(value);
        }
    
        protected void Button2_Click(object sender, EventArgs e)
        {
          // Call the SubtractFrom service operation.
          value = 50.00D;
          client.SubtractFrom(value);
        }
    
        protected void Button3_Click(object sender, EventArgs e)
        {
          // Call the MultiplyBy service operation.
          value = 17.65D;
          client.MultiplyBy(value);
        }
    
        protected void Button4_Click(object sender, EventArgs e)
        {
          // Call the DivideBy service operation.
          value = 2.00D;
          client.DivideBy(value);
        }
      }
    }
    
    


    请各位朋友帮我看看,怎样才能解决,谢谢.
    开发环境:VS2008Sp1+Framework3.5Sp1
    2010年6月11日 7:23

答案

全部回复

  • 现在问题的关键变为以下代码了:
       public void Result(double result1)
        {
          this.TextBox1.Text += result1.ToString() + "\r\n";
          
        }
    
        public void Equation(string eqn)
        {
          this.TextBox1.Text += eqn + "\r\n";
        }



    在调试的时候,可以给TextBox赋值,但是结果却不会显示在浏览器窗口.
    是不是要刷新?
    还是因为线程间调用控件的问题?

    但是Asp.net却没有像Winform一样的this.invoke结合委托来跨线程调用控件哦.
    2010年6月11日 9:39
  • 代码运行和调试都没有问题哦,回调也有结果,但是就是在客户端显示不出来.
    我现在觉得是回调操作控件有问题吧.
    2010年6月12日 1:33
  • 这里好少人哦,我应该怎么办呢?
    2010年6月13日 0:42
  • 把你的双工服务换成单工服务.
    2010年6月13日 6:57
  • 你在Page里创建wcf proxy,则其生命周期和Page一致,即返回页面给客户后就销毁。因此,当服务端回调返回结果时,wcf proxy可能已经Dispose了,当然就无法获得结果。

    如果你需要在Asp.net页面中用双工WCF来及时更新信息,一些可用的方案有:

    1. 用Silvelright + PollingHttpDuplexBinding WCF
    2. 用AJAX来轮询WCF

     


    Mog Liang
    2010年6月14日 8:49
  • 你在Page里创建wcf proxy,则其生命周期和Page一致,即返回页面给客户后就销毁。因此,当服务端回调返回结果时,wcf proxy可能已经Dispose了,当然就无法获得结果。

    如果你需要在Asp.net页面中用双工WCF来及时更新信息,一些可用的方案有:

    1. 用Silvelright + PollingHttpDuplexBinding WCF
    2. 用AJAX来轮询WCF

    Mog Liang


    版主,你好.

    我对Ajax轮询WCF这个方案比较感兴趣,能否提供一些资料呢.

    谢谢.

    2010年6月17日 6:09
  • 你在Page里创建wcf proxy,则其生命周期和Page一致,即返回页面给客户后就销毁。因此,当服务端回调返回结果时,wcf proxy可能已经Dispose了,当然就无法获得结果。

    如果你需要在Asp.net页面中用双工WCF来及时更新信息,一些可用的方案有:

    1. 用Silvelright + PollingHttpDuplexBinding WCF
    2. 用AJAX来轮询WCF

    Mog Liang


    版主,你好.

    我对Ajax轮询WCF这个方案比较感兴趣,能否提供一些资料呢.

    谢谢.


    参见这篇

    http://tomasz.janczuk.org/2009/08/ajax-client-for-http-polling-duplex-wcf.html


    Mog Liang
    • 已标记为答案 KeFang Chen 2010年6月21日 6:56
    • 取消答案标记 zhxingway 2010年6月24日 9:00
    2010年6月17日 8:37
  • 版主,我试了,下面的网站都打不开:

    http://tomasz.janczuk.org/2009/08/ajax-client-for-http-polling-duplex-wcf.html

     

    http://tomasz.janczuk.org/

     

    http://janczuk.org/这个可以打开,但是并没有所需的资料,请帮帮忙,再提供一些资料,

    或者告诉我应该以什么关键字在哪些网站上搜索资料,谢谢!

     

     

    2010年6月18日 1:35
  • 你想办法翻墙吧.

    google搜索关键词ajax duplex wcf

     


    Mog Liang
    • 已标记为答案 zhxingway 2010年6月24日 8:59
    2010年6月18日 2:00
  • 你想办法翻墙吧.

    google搜索关键词ajax duplex wcf

     


    Mog Liang

    谢谢版主了.
    2010年6月24日 8:59