我有一个使用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)
有什么想法吗?
库尔特
答案 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做的那样)它也停止工作......