locked
Silverlight访问Web服务常见问题解答 RRS feed

全部回复

  •  

    3.  如何在Silverlight中如何处理WCF FaultException异常?

    Silverlight 3 支持 WCF SOAP Fault编程模式。然而,默认情况下, WCF 服务返回带有HTTP 500响应码的错误信息,而其不能在Silverlight中被访问到。解决办法之一是定义WCF端点行为,插入MessageInspector 来将500信息码改为200。

    行为代码示例:

        public class SilverlightFaultBehavior : BehaviorExtensionElement, IEndpointBehavior

        {       

            public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)

            {

                SilverlightFaultMessageInspector inspector = new SilverlightFaultMessageInspector();

                endpointDispatcher.DispatchRuntime.MessageInspectors.Add(inspector);

            }

     

            public class SilverlightFaultMessageInspector : IDispatchMessageInspector

            {

                public void BeforeSendReply(ref Message reply, object correlationState)

                {

                    if (reply.IsFault)

                    {

                        HttpResponseMessageProperty property = new HttpResponseMessageProperty();

     

                        // Here the response code is changed to 200.

                        property.StatusCode = System.Net.HttpStatusCode.OK;

     

                        reply.Properties[HttpResponseMessageProperty.Name] = property;

                    }

                }

               

                public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)

                {

                    // Do nothing to the incoming message.

                    return null;

                }

            }

     

            // The following methods are stubs and not relevant.

            public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)

            {

            }

     

            public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)

            {

            }

     

            public void Validate(ServiceEndpoint endpoint)

            {

            }

     

            public override System.Type BehaviorType

            {

                get { return typeof(SilverlightFaultBehavior); }

            }

     

            protected override object CreateBehavior()

            {

                return new SilverlightFaultBehavior();

            }

     

        }

     


    Please remember to mark the replies as answers if they help and unmark them if they provide no help. Windows Azure Platform China Blog: http://blogs.msdn.com/azchina/default.aspx
    2010年6月14日 1:45
    版主
  •  

    为将此行为加入WCF服务配置文件, 请参考如下:

    <system.serviceModel>

        <extensions>

         <behaviorExtensions>

            <add name=”silverlightFaults”

                 type=”Microsoft.Silverlight.Samples.SilverlightFaultBehavior,

                 SilverlightFaultBehavior,

                 Version=1.0.0.0,

                 Culture=neutral,

                 PublicKeyToken=null”/>

          </behaviorExtensions>

        </extensions>

        <behaviors>

            <endpointBehaviors>

              <behavior name=”SilverlightFaultBehavior”>

                <silverlightFaults/>

              </behavior>

            </endpointBehaviors>

        </behaviors>

        <services>

            <service name=”Calculator.Web.Service”>

                <endpoint address=””

                          binding=”basicHttpBinding”

                          contract=”Calculator.Web.Service”

                          behaviorConfiguration=”SilverlightFaultBehavior” />

    </service>

      </services>

    </system.serviceModel>

     

    更多有关如何在Silverlight中处理WCF 错误的信息,请参考如下文章:

    http://msdn.microsoft.com/en-us/library/dd470096(VS.95).aspx

     


    Please remember to mark the replies as answers if they help and unmark them if they provide no help. Windows Azure Platform China Blog: http://blogs.msdn.com/azchina/default.aspx
    2010年6月14日 1:46
    版主
  •  

    4.   如何在不重新编译的情况下改变客户端信道配置?

     

    一些用户会碰到一些问题:当部署Silverlight应用程序时,他们需要更新Silverlight服务端点地址和重新编译Silverlight项目。

    如果我们创建服务客户端时使用“ServiceReferences.ClientConfig”文件内的配置,那我们便可以在不重新编译项目的情况下改变配置了。Silverlight 应用程序文件 “xap”为zip格式 ,我们可是使用解压工具解压出 xap 文件, 找到“ServiceReferences.ClientConfig” 文件,打开并更新端点配置。

    如果Silverlight 应用程序以及Silverlight使用的服务在同一个站点,我们在Silverlight内可以编写代码来引用服务地址。举例:

                var client2 = new Service1Client(

                    new BasicHttpBinding(),

                    new EndpointAddress(

                        // endpoint address http://[site]/[subfolders]/Service1.svc

                        new Uri(

                            Application.Current.Host.Source,

                            "/[subfolders]/Service1.svc")));

     

    这样做,当部署网站时我们便无需更新客户端端点地址。

     


    Please remember to mark the replies as answers if they help and unmark them if they provide no help. Windows Azure Platform China Blog: http://blogs.msdn.com/azchina/default.aspx
    2010年6月14日 1:46
    版主
  •  

    5.   如何在Silverlight中使用RSS?

     

    以下是在Silverlight中如何使用RSS的步骤:

    1.       用WebClient下载RSS资源

    2.       使用SyndicationFeed来分析下载后的RSS流

    以下是如何在Silverlight中使用Youtube API(RSS格式)的示例

    http://forums.silverlight.net/forums/p/110790/254912.aspx

     


    Please remember to mark the replies as answers if they help and unmark them if they provide no help. Windows Azure Platform China Blog: http://blogs.msdn.com/azchina/default.aspx
    2010年6月14日 1:46
    版主
  •  

    6.   如何将数据从服务器推送至Silverlight?

     

    有时,我们需要将数据从服务器推送至 Silverlight 客户端。这种情况下,双工服务是用的。传统的双工方案并不适用于Silverlight。为了实现双工通信,请使用 “PollingDuplexHttpBinding” 类型的绑定,以下是一个完整示例 :

    http://msdn.microsoft.com/en-us/library/dd470105(VS.95).aspx

     

    7.   如何解决 WCF 部署问题?

     

    一些用户在IIS上部署Silverlight后遭遇了一些WCF访问问题

    以下是帮助定位和解决问题的一些建议:

    ·         如果需要得到客户端异常的细节,我们可以配置serviceDebug 行为

    <serviceDebug includeExceptionDetailInFaults="true" />

    为了安全性考虑,在调试完毕后,请关闭该行为。

    ·         使用fiddler工具捕捉网络通信来检查是客户端还是服务器端引起的问题,这对于定位问题的根本原因非常有效。

    ·         在部署Silverlight托管网站之后, WCF 服务地址可能会有改变。我们需要改变客户端端点配置来引用新的WCF地址。如果我们遭遇了跨域问题,那我们需要在网站根目录下部署跨域策略文件。更多关于跨域问题信息,请参考如下文章:

    http://msdn.microsoft.com/en-us/library/cc645032(VS.95).aspx

    ·         我们在IIS上部署WCF服务之后,服务运行与于其上的账户可能会更改。如果我们的应用程序需要对于特定资源,如读写文件,数据库,的权限,那么对于服务所属的账户请赋予相应的权限。

    ·         我可以从如下网站寻找更多调试建议:

    http://forums.silverlight.net/forums/t/146423.aspx


    Please remember to mark the replies as answers if they help and unmark them if they provide no help. Windows Azure Platform China Blog: http://blogs.msdn.com/azchina/default.aspx
    2010年6月14日 1:46
    版主