使用VS2012,框架4.5
我有一个简单的 webapp,只有一个 WebService.asmx 文件。运行该项目会发布这 2 个 Web 方法,SetData
并且GetData
,这里是 C# 代码:
[WebService(Namespace = "http://mydomain.com/")]
[System.Web.Script.Services.ScriptService]
public class WebService: System.Web.Services.WebService {
[WebMethod(EnableSession=true)]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string SetData() {
HttpContext.Current.Session["someData"] = "xxxxxxxxx";
return "";
}
[WebMethod(EnableSession = true)]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string GetData() {
if (HttpContext.Current.Session["someData"] == null)
return "Session NULL";
else
return HttpContext.Current.Session["someData"].ToString();
}
}
web.config 设置为启用 CORS 并aspNetCompatibilityEnabled
启用会话共享
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="null" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
<add name="Access-Control-Allow-Credentials" value="true" />
</customHeaders>
</httpProtocol>
</system.webServer>
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
</system.serviceModel>
所以项目运行良好。现在我想从一个简单的 HTML 页面使用这两种方法(HTML不是ASPNET 项目的一部分,只是一个 HTML 文件......因此存在 CORS 问题)这是 HTML 代码(为了简单起见,省略了 HTML 标签,但它只是一个空页面):
<script type="text/javascript">
$(document).ready(function() {
//jQuery.support.cors = true;
$.ajax({
type: "POST",
url: "http://localhost:62776/WebService.asmx/SetData",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(msg) {
alert('SetData OK');
$.ajax({
type: "POST",
url: "http://localhost:62776/WebService.asmx/GetData",
contentType: "application/json; charset=utf-8",
dataType: "json",
//async: true, -- makes no difference
//beforeSend: function(xhr){
// xhr.withCredentials = true;
//},
success: function(msg) {
alert('GetData: ' + msg.d);
},
error: function(e){
alert("GetData: Unavailable");
}
});
},
error: function(e){
alert("SetData: Unavailable");
}
});
});
</script>
运行 HTML 页面给了我SetData OK
然后GetData: Session NULL
但我想要GetData: xxxxxx
所以我的问题是,如何Session Object
在 CORS 调用之间访问相同的内容?
我还尝试启用身份验证,认为 ASPNET AUTH COOKIES 会以某种方式在 AJAX 调用之间保持正确的会话 ID,但它不起作用。有一种可能的方法使用 SOAP 信封来验证每个 AJAX 调用并发送会话信息,但这似乎有点过头了。