我在ASP.NET MVC4 Web应用程序中启用SSL后发现了一种奇怪的行为。首先,这里有一点关于我正在尝试做什么的解释:如果模型验证失败,向服务器发送请求并显示错误消息。这是我用于此目的的Action-filter:
public class ValidateModelAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext pFilterContext)
{
if (!pFilterContext.Controller.ViewData.ModelState.IsValid)
{
var msg = «Custom errormessage»
pFilterContext.Result = new HttpStatusCodeResult(HttpStatusCode.BadRequest, msg);
}
}
}
在客户端($ .ajax())上我只做这个:
alert(jqXhr.statusText);
这一切都完美无缺,直到我设置应用程序以支持SSL加密。这是奇怪的部分出现的地方。在我的本地工作机器而不是自定义错误消息上,我得到一个包含字符串(«error»)的警报,我假设它是jQuery库设置的默认文本。但是,如果将应用程序发布到远程Web服务器(在我的情况下是Windows Azure),我会获得自定义文本。 根据Chrome的控制台,当我在本地主机上运行应用程序时,我从服务器上得不到任何回复
jquery.js:8706 POST https://localhost:44300/my/url 400 ()
这就是远程服务器上的样子
jquery.js:8706 POST https://myurl.azurewebsites.net/my/url 400 (Custom errormessage)
这里有一些我用来设置HTTPS的配置代码。
在web.config中:
<system.web>
<httpCookies httpOnlyCookies="true" requireSSL="true"/>
<authentication mode="Forms">
<forms loginUrl="Account/Login" timeout="1440" slidingExpiration="true" requireSSL="true"></forms>
</authentication>
</system.web>
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Strict-Transport-Security" value="max-age=16070400; includeSubDomains" />
</customHeaders>
</httpProtocol>
</system.webServer>
WebApiConfig.cs:
public static void Register(HttpConfiguration pConfig)
{
pConfig.MessageHandlers.Add(new RequireHttpsHandler());
//...
}
RequireHttpsHandler.cs:
public class RequireHttpsHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage pRequest, CancellationToken pCancellationToken)
{
if (pRequest.RequestUri.Scheme != Uri.UriSchemeHttps)
{
return Task<HttpResponseMessage>.Factory.StartNew(() =>
{
var response = new HttpResponseMessage(HttpStatusCode.Forbidden)
{
Content = new StringContent("HTTPS required!")
};
return response;
}, pCancellationToken);
}
return base.SendAsync(pRequest, pCancellationToken);
}
}
}
FilterConfig.cs
public static void RegisterGlobalFilters(GlobalFilterCollection pFilters)
{
pFilters.Add(new RequireHttpsAttribute());
}
有谁知道我的问题可能是什么来源以及如何解决?谷歌这次无法帮助我。