为什么我的WCF JSONP服务不通过HTTPS返回JSONP

时间:2012-10-04 22:47:27

标签: ajax wcf azure jsonp

我有一个使用JSONP(在Azure中托管)的WCF服务。它在HTTP上运行得非常好,即,如果它只接收JSON,它只返回JSON,如果它收到JSONP,则返回JSONP。但是,只要我切换到HTTPS(仅在Azure中提供HTTPS端点),它就会返回JSON,无论调用是JSON还是JSONP。我的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>

到standardEndpoint标记,因此:

<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的HTTP7绑定更改为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)

有什么想法吗?

库尔特

1 个答案:

答案 0 :(得分: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做的那样)它也停止工作......