none
关于silverlight3 的双工问题。 RRS feed

  • 问题

  • 配置环境 :
    先安装 英文vs2008 + silverlight 3
    覆盖安装 中文vs2008

    目前问题
    按照 如何:构建双工服务http://msdn.microsoft.com/zh-cn/library/cc645027(VS.95).aspx 文章所示,全部编译完成,并追加wcf跨域访问文件。
    之后将wcf部署到本地iis下,ie访问正常。

    当用silverlight3访问时,vs2008 直接死掉,无法捕获异常。
    后察看事件查看器 得到如下结果。

    错误应用程序 devenv.exe,版本 9.0.30729.1,时间戳 0x488f2b50,错误模块 ntdll.dll,版本 6.0.6001.18000,时间戳 0x4791a7a6,异常代码 0xc0000005,错误偏移量 0x0004097b, 进程 ID 0x11c4,应用程序启动时间 0x01ca0b55903ea85d。



    .NET Runtime version 2.0.50727.3074 - 执行引擎错误(72A61132) (0)

    (注意这是两个错误)。

    后用浏览网页的方式打开silverlight3的测试页,得到异常为:

    网页错误详细信息

    用户代理: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.5.21022; .NET CLR 3.0.30618; .NET CLR 3.5.30729)
    时间戳: Thu, 23 Jul 2009 05:55:07 UTC


    消息: Unhandled Error in Silverlight Application AsyncCallback 引发异常。   位于 System.ServiceModel.AsyncResult.Complete(Boolean completedSynchronously)
       位于 System.ServiceModel.AsyncResult.Complete(Boolean completedSynchronously, Exception exception)
       位于 System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.OnGetResponse(IAsyncResult result)
       位于 System.Net.Browser.BrowserHttpWebRequest.<>c__DisplayClassd.<InvokeGetResponseCallback>b__b(Object state2)
       位于 System.Threading._ThreadPoolWaitCallback.WaitCallback_Context(Object state)
       位于 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       位于 System.Threading._ThreadPoolWaitCallback.PerformWaitCallbackInternal(_ThreadPoolWaitCallback tpWaitCallBack)
       位于 System.Threading._ThreadPoolWaitCallback.PerformWaitCallback(Object state)
    行: 1
    字符: 1
    代码: 0
    URI:
    file:///C:/Users/Administrator/Documents/Visual%20Studio%202008/Projects/WcfDuplex/DuplexClient/Bin/Debug/TestPage.html

    请问,silverlight3 与 silverlight2 在此处有何差异?



    2009年7月23日 6:35

答案

全部回复

  • 不兼容的 英文和中文的编码不同 直接造成程序死掉
    2009年7月23日 7:18
  • 感谢mldark的提醒,已经将中文版卸载。vs2008可正常报出错误。

    现在报错地点为:

        void CompleteOnSend(IAsyncResult result)
            {
                try
                {
                    IDuplexSessionChannel channel = (IDuplexSessionChannel)result.AsyncState;

                    channel.EndSend(result);   //此处异常。

                    // The message is now sent. Notify the user.

                    uiThread.Post(WriteText, "Client says: Sent order of " + order + Environment.NewLine);
                    uiThread.Post(WriteText, "Service will call back with updates" + Environment.NewLine);
                }
                catch (Exception ex)
                {
                    WriteText(ex.InnerException.ToString());
                }

            }


    异常内容为:
    System.Net.WebException: 远程服务器返回了错误: NotFound。 ---> System.Net.WebException: 远程服务器返回了错误: NotFound。\r\n   位于 System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult)\r\n   位于 System.Net.Browser.BrowserHttpWebRequest.<>c__DisplayClass5.<EndGetResponse>b__4(Object sendState)\r\n   位于 System.Net.Browser.AsyncHelper.<>c__DisplayClass2.<BeginOnUI>b__0(Object sendState)\r\n   --- 内部异常堆栈跟踪的结尾 ---\r\n   位于 System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state)\r\n   位于 System.Net.Browser.BrowserHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)\r\n   位于 System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.CompleteGetResponse(IAsyncResult result)


    多次单步调试结果为:
            void CompleteOpenChannel(IAsyncResult result)
            {
                try
                {
                    IDuplexSessionChannel channel = (IDuplexSessionChannel)result.AsyncState;

                    channel.EndOpen(result);

                    // The channel is now open. Send a message.
                    Message message =
                        Message.CreateMessage(channel.GetProperty<MessageVersion>(),
                        "Silverlight/IDuplexService/Order", order);
                    IAsyncResult resultChannel =
                        channel.BeginSend(message, new AsyncCallback(OnSend), channel);     //此处resultChannel的IsCompleted与CompletedSynchronously均为false

                    if (!resultChannel.IsCompleted)
                    {
                        WriteText("消息发送失败");
                    }

                    if (resultChannel.CompletedSynchronously)
                    {
                        CompleteOnSend(resultChannel);
                    }
                   


                    // Also start the receive loop to listen for callbacks from the service.
                    ReceiveLoop(channel);
                }
                catch (Exception ex)
                {
                    WriteText(ex.Message + ex.InnerException.ToString());
                }
            }


    说明消息未发出。
    还请指点如何继续调试。

    2009年7月23日 18:50
  • 补充:

    1. EndpointAddress 中的IsAnonymous 属性 为false . 是否说明该终结点不能匿名访问?

    2. wcf分别在调试环境及iis中部署过,均为此异常。



    还请指点继续调试的方法。
    2009年7月23日 19:18
  • 初步确定为:silverlight3 与 WCF 互相扯皮。
    2009年7月23日 20:07
  • 你好,

    请测试我写的这个程序看看。我这边运行是没问题的:
    http://cid-2fa13ebc6cc8e80f.skydrive.live.com/self.aspx/Public/SL3Duplex.zip
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    2009年7月27日 7:57
    版主
  • Allen Chen 你好:

    感谢你的回复,刚看完你的代码。但感觉像是异步调用,可能我刚学silverlight,还有很多不懂得地方。还请老兄指点。
    2009年7月27日 8:12
  • 你好,
    这就是Silverlight 3里使用pollingDuplexHttpBinding的例子。你也可以参考:
    http://msdn.microsoft.com/en-us/library/dd470106(VS.95).aspx
    你可以看到服务器端调用了两次Equals方法,客户端收到两次请求。
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    2009年7月27日 8:15
    版主
  • 你好,
    没错是调用一次,出现两次。那请问第二次是什么原因出现的?

    2009年7月27日 8:22
  • 你好,
    请看一下Service1.svc.cs里的代码,可以看到调用了两次callback.Equals()方法,所以客户端会收到两次消息。我们在相应的Received事件处理中就能捕获到消息的接收事件。你也可以在这个方法里让线程睡眠等等来测试。请在这个基础上自行测试。


    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    2009年7月27日 8:30
    版主
  • 抱歉,抱歉,晕了,没看见循环。
    也就是说,只要在服务器端保留IService1DuplexCallback,其他方法中调用该对象,即可发送给客户端。
    比如将IService1DuplexCallback类型保存在Application中。即可随时触发?

    2009年7月27日 8:36
  • 对,可以这么理解。
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    2009年7月27日 8:45
    版主
  • 哈,感谢版主。
    2009年7月27日 8:46