1

我有一个使用 JSONP(托管在 Azure 中)的 WCF 服务。它在 HTTP 上工作得非常好,即,如果它只接收 JSON,它只返回 JSON,如果它接收 JSONP,它返回 JSONP。但是,一旦我切换到 HTTPS(仅在 Azure 中提供 HTTPS 端点),无论调用是 JSON 还是 JSONP,它都只返回 JSON。我对 HTTP 的配置是:

<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
<standardEndpoints>
  <webScriptEndpoint>
    <standardEndpoint name="" crossDomainScriptAccessEnabled="true">          
    </standardEndpoint>
  </webScriptEndpoint>
</standardEndpoints>
<behaviors>
  <serviceBehaviors>
    <behavior>
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>

在服务 Global.asax 文件中,我有:

public class Global : System.Web.HttpApplication
{
    protected void Application_Start(object sender, EventArgs e)
    {
        RegisterRoutes(RouteTable.Routes);
    }

    void RegisterRoutes(RouteCollection routes)
    {
        routes.Add(new ServiceRoute("DirectTvService", new WebScriptServiceHostFactory(), typeof(DirectTVService.DirectTvService)));
    }       
}

我想从 HTTP 更改为 HTTPS,所以我添加

<security mode="Transport">
</security>

到标准端点标签,因此:

<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
<standardEndpoints>
  <webScriptEndpoint>
    <standardEndpoint name="" crossDomainScriptAccessEnabled="true">
      <security mode="Transport">
      </security>
    </standardEndpoint>
  </webScriptEndpoint>
</standardEndpoints>
<behaviors>
  <serviceBehaviors>
    <behavior>
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>

我将 IIS7 绑定从 HTTP 更改为 HTTPS。使用此配置,服务按预期对 JSON 工作,但仅针对 JSONP 请求返回 JSON(响应未包装在回调函数中。

我的客户请求的一个示例(在 CoffeeScript 中)是:

$.ajax
url: callUrl
dataType: 'jsonp'
data: 
    username: $('#txtUsername').val()
    password: $('#txtPassword').val()
success: (data) =>
    $.unblockUI()
    Application.processLoginData data
    false
error: (d, msg, status) ->
    $.unblockUI()
    alert "There was a problem contacting the database. " + status
    false

我的服务方法装饰有:

[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json)]
public LoginResponse LoginUser(String username, String password)

有任何想法吗?

库尔特

4

1 回答 1

1

奇怪的是,一个可行的解决方案是在 Azure 配置中同时拥有 HTTP 和 HTTPS 端点,但在我的 WCF 配置中只提供一个端点。我使用了以下 serviceModel 配置:

  <system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
<standardEndpoints>
  <webScriptEndpoint>
    <standardEndpoint name="" crossDomainScriptAccessEnabled="true">
    </standardEndpoint>
  </webScriptEndpoint>
</standardEndpoints>
<behaviors>
  <serviceBehaviors>
    <behavior>
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>

一切正常。一旦我删除 Azure 配置中的 HTTP 端点,JSONP 就会停止工作(只返回 JSON),如果我添加

<security mode="Transport">
</security>

到standardEndPoint(正如我期望对HTTPS所做的那样)它也停止工作......

于 2012-10-04T22:53:42.853 回答