zoukankan      html  css  js  c++  java
  • (转)WCF/Silverlight 相关总结

    绑定的选择

    毫无疑问,我们应该选择BasicHttpBinding,这也是Silverlight仅仅支持的一种绑定。

    WCF异常的处理

    Silverlight无法获取WCF异常(例如:FaultException)。如果WCF服务抛出WCF异常,在客户端应用程序只能够获得 HTTP 404错误。无疑,这会干扰调用者对异常的捕捉,同时也无法获知真正的异常信息。一种好的做法是在服务方法中定义一个out参数,在该参数中包含HTTP Status以及异常信息。可以定义一个返回信息的数据契约,例如:

    [DataContract]
    public class CallResult
    {
        public CallResult()
        {
            StatusCode = 0;
            StatusMessage = "OK";
        }
        [DataMember]
        public int StatusCode
        {get; set;}
        [DataMember]
        public string StatusMessage
        {get; set;}
        [DataMember]
        public string ExceptionDetails
        {get; set;}
    }

    编写服务方法时,可以采用如下方式:

    public double Convert(string from, string to, out CallResult status)
    {
        status = new CallResult();
        if (string.IsNullOrEmpty(from) ||
            string.IsNullOrEmpty(to))
        {
            status.StatusCode = 2;
            status.StatusMessage = "Invalid or empty curreny symbols specified";
            return 0;
        }
        try
        {
            string config = ConfigurationManager.AppSettings["htmlparserconfig"];
            var converter = new CurrencyConverter(config);
            return converter.Convert(from, to);
        }
        catch (Exception ex)
        {
            status.StatusCode = 9;
            status.StatusMessage = "Failed to get currency conversion rate";
            status.ExceptionDetails = ex.Message;
            //TODO: Log this message.
        }
        return 0;
    }

    WCF服务的部署

    在将WCF服务部署在Web服务器上时,最好在配置文件中为WCF服务添加一个基地址。如果未来需要修改WCF服务的部署地址,仅仅需要修改配置文件的基地址即可,其余位置不需要做任何修改。

    <host>
      <baseAddresses>
        <add baseAddress="http://www.myhostserver.com/MyWCFServices/"/>
      </baseAddresses>
    </host>

    此外,至关重要的一点是要让服务跨域边界可用。Silverlight 在默认情况下只允许源站点通信。若要允许 Silverlight 控件访问其他域上的服务,该服务必须明确选择允许跨域访问。通过选择,服务声明它公开的操作可以由 Silverlight 控件安全地调用,而不会对该服务存储的数据造成具有潜在危害的结果。Silverlight 2.0 支持两种不同的机制供服务选择跨域访问:
    (1)在承载服务的域的根目录中放置一个 clientaccesspolicy.xml 文件,以配置服务允许跨域访问。
    (2)在承载服务的域的根目录中放置一个有效的 crossdomain.xml 文件。该文件必须将整个域标记为 public。

    例如,创建如下的clientaccesspolicy.xml文件:

    <?xml version="1.0" encoding="utf-8"?>
    <access-policy>
      <cross-domain-access>
        <policy>
          <allow-from http-request-headers="*">
            <domain uri="*"/>
          </allow-from>
          <grant-to>
            <resource path="/" include-subpaths="true"/>
          </grant-to>
        </policy>
      </cross-domain-access>
    </access-policy>

    如果只允许从其他域中的一个进行访问(例如 http://agiledon.com),clientaccesspolicy.xml 应当包含以下配置:

    <?xml version="1.0" encoding="utf-8"?>
    <access-policy>
      <cross-domain-access>
        <policy>
          <allow-from http-request-headers="*">
            <domain uri="http://agiledon.com"/>
          </allow-from>
          <grant-to>
            <resource path="/" include-subpaths="true"/>
          </grant-to>
        </policy>
      </cross-domain-access>
    </access-policy>

    然后再将该文件保存到托管该服务的域的根目录中。例如,如果该服务在 http://agiledon.com 上承载,则文件必须位于 http://agiledon.com/clientaccesspolicy.xml。

    如果进行如上的配置,在Silverlight跨域访问时,就会出现一个安全错误。

  • 相关阅读:
    Linux初学
    Linux初学
    EntityFramework IEnumerable,IQueryable ,Include
    EntityFramework 4/5/6 中执行自定义SQL语句
    ServiceStack Web Service 创建与调用简单示列
    ServiceStack 概念
    Couchbase 环境搭建与使用(C#)
    Redis 环境搭建与使用(C#)
    分享几段JavaScript
    Activemq 平台搭建与C#示列
  • 原文地址:https://www.cnblogs.com/Dlonghow/p/1700475.html
Copyright © 2011-2022 走看看