通过 SSL 使用 JSONP 的 WCF 服务

Posted

技术标签:

【中文标题】通过 SSL 使用 JSONP 的 WCF 服务【英文标题】:WCF service with JSONP over SSL 【发布时间】:2011-07-08 16:58:01 【问题描述】:

我们有一个托管 WCF 服务的 SSL 配置网站。服务的绑定有crossDomainScriptAccessEnabled="true",通信使用JSON序列化。

当我们从 http 请求这个服务时,它返回 JSONP,但是当使用 HTTPS 请求它时,它只返回 JSON。无论哪种方式,我都需要 JSONP,请帮忙。

目前的配置是这样的:

<webHttpBinding>
        <binding name="webHttpBindingWithJsonP" crossDomainScriptAccessEnabled="true" />
</webHttpBinding>

<behaviors>
            <serviceBehaviors>
                <behavior name="JsonServiceBehaviors">
                    <serviceMetadata httpGetEnabled="true"/>
                    <serviceDebug includeExceptionDetailInFaults="true" />
                </behavior>
            </serviceBehaviors>
            <endpointBehaviors><behavior name="webHttpBehavior">
                <webHttp />
            </behavior></endpointBehaviors>
</behaviors>

<services>
            <service name="Backend.CIService" behaviorConfiguration="JsonServiceBehaviors">
                <endpoint address="" binding="webHttpBinding" 
                          bindingConfiguration="webHttpBindingWithJsonP" contract="Backend.ICIService"
                          behaviorConfiguration="webHttpBehavior"/>
            </service></services>

【问题讨论】:

【参考方案1】:

如果你使用这个配置会发生什么:

<webHttpBinding>
  <binding name="jsonp" crossDomainScriptAccessEnabled="true" />
  <binding name="jsonpSsl" crossDomainScriptAccessEnabled="true">
    <security mode="Transport" />
  </binding>
</webHttpBinding>

<behaviors>
  <serviceBehaviors>
    <behavior name="JsonServiceBehaviors">
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
  <endpointBehaviors>
    <behavior name="webHttpBehavior">
      <webHttp />
    </behavior>
  </endpointBehaviors>
</behaviors>

<services>
  <service name="Backend.CIService" behaviorConfiguration="JsonServiceBehaviors">
    <endpoint address="" binding="webHttpBinding" 
      bindingConfiguration="jsonp" contract="Backend.ICIService"
      behaviorConfiguration="webHttpBehavior"/>
    <endpoint address="" binding="webHttpBinding" 
      bindingConfiguration="jsonpSsl" contract="Backend.ICIService"
      behaviorConfiguration="webHttpBehavior"/>
  </service>
</services>

问题在于,如果您想通过 HTTP 和 HTTPS 调用服务,您必须提供两个端点 - 一个用于 HTTP,一个用于 HTTPS。

【讨论】:

我以前从未能够同时使用 http 和 https,即使使用多个端点也是如此。我不确定我到底做错了什么,但这是我见过的最不容易混淆(也是最成功)的 wcf 答案。事实上这是有道理的 :) 不仅如此,它还让我对跨域脚本的需求变得多余!呜呼! :D 对于 WCF 的新手... 元素需要放在 元素中。 同上@Radderz - 我不明白为什么互联网上到处都是难以理解的例子。不知道为什么这个例子有效,而其他 20 个没有(毫无疑问是因为我做错了什么),但我终于让我的 WCF 服务通过 http 和 https 响应,并且是 RESTful 启动!

以上是关于通过 SSL 使用 JSONP 的 WCF 服务的主要内容,如果未能解决你的问题,请参考以下文章

经过身份验证的服务不支持跨域 javascript 回调。通过 SSL 代理对 WCF 服务的 AJAX 查询

WCF:使用 JSONP 将来源列入白名单

通过 SSL 进行 WCF 通信:由于第三方受信任的根证书颁发机构导致的 WCF 访问问题

调用 WCF 服务时 JSONP 自动完成失败

使用 SSL 找不到资源 wcf 服务

如何为现有的 WCF 服务原生启用 JSONP?