询问者
Silverlight访问Web服务常见问题解答

问题
-
目录
1. 如何在Silverlight中访问ASP.NET session?
3. 如何在Silverlight中如何处理WCF FaultException异常?
1. 如何在Silverlight中访问ASP.NET session?
一个方法是创建带有ASP.NET session功能的WCF,然后让Silverlight使用它
请尝试以下步骤来使得WCF带有 ASP.NET session 功能:
1. 创建一个服务契约,提供一个session查询方法 (简化起见,我们只查询字符串类型)
[ServiceContract]
public interface ISessionService
{
[OperationContract]
string GetSessionString(string key)
}
2. 创建WCF服务类来实现我们的服务契约,并在该服务类上应用AspNetCompatibilityRequirementsAttribute 属性
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class sessionwcf: ISessionService
{
public string GetSessionString(string key)
{
return HttpContext.Current.Session[key] as string;
}
}
3. 在 web.config文件内,添加如下语句, 来实现aspNetCompatibility功能
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
2. 如何在Silverlight中使用DataSet?
Silverlight 并不支持dataset。要使用dataset,请将序列化DataSet XML转换成特定的集合类型。Sladapter提供了一个优秀的解决方案。请从如下网址获得更多信息。
http://forums.silverlight.net/forums/t/16733.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- 已编辑 Allen Chen - MSFTModerator 2010年6月14日 1:50
2010年6月14日 1:43版主
全部回复
-
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.aspx2010年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.aspx2010年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.aspx2010年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.aspx2010年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服务之后,服务运行与于其上的账户可能会更改。如果我们的应用程序需要对于特定资源,如读写文件,数据库,的权限,那么对于服务所属的账户请赋予相应的权限。
· 我可以从如下网站寻找更多调试建议:
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.aspx2010年6月14日 1:46版主