Using SignalR V2 RC1我有一个 SignalR 自承载控制台应用程序,该应用程序允许位于绑定到 http://*:8080 的 Server1 上的 CORS 连接。
在Server2上,我有一个使用Windows身份验证的MVC 4内部网网站。
当用户首次通过Server3上的浏览器访问默认页面时,MVC控制器会分配一个cookie。我希望此 cookie 从浏览器传递到 Server1 上的 SignalR 应用程序。
当通过VS2012在本地执行此操作时,我可以清楚地看到cookie在浏览器中设置,随后在每个连接上传递给自托管应用程序(在VS2012的另一个实例中运行)。
在上述服务器上完成时,Cookie 不再与 SignalR 请求一起发送。
这个问题似乎不是IE9特有的(我知道IE9在根据SignalR IE9跨域请求通过CORS连接传递cookie时存在问题,不起作用),因为我也尝试过这个与Firefox相同的结果。
我从 https://github.com/SignalR/SignalR/issues/1735 那里得到的印象是,有关 CORS 和 cookie 的问题已针对 SignalR v2 RC1 得到解决。那么我做错了什么?
我已经通过将 cookie 详细信息放入查询字符串中来引入解决方法,但我宁愿通过跨域传递 cookie 来使其正常工作。
为了完整起见,SignalR 自托管应用程序配置如下,尽管我猜这真的与客户端在发送 cookie 方面发生的事情无关
public class StartupSignalR
{
public void Configuration(IAppBuilder app)
{
app.Map("/signalr", map =>
{
map.UseCors(CorsOptions.AllowAll);
var hubConfiguration = new HubConfiguration
{
EnableJSONP = true
};
map.RunSignalR(hubConfiguration);
});
}
}
客户端js如下
<script src="Scripts/jquery-1.8.2.min.js"></script>
<!--Reference the SignalR library. -->
<script src="Scripts/jquery.signalR-2.0.0-rc1.min.js"></script>
<!--Reference the autogenerated SignalR hub script. -->
<script src="http://10.144.20.150:8080/signalr/hubs"></script>
<!--Add script to update the page and send messages.-->
<script src="Scripts/jquery.cookie.js"></script>
<script type="text/javascript">
$(function () {
//Set the hubs URL for the connection
$.connection.hub.url = "http://10.144.20.150:8080/signalr";
$.connection.hub.qs = { 'Token': $.cookie("Token") };
// Declare a proxy to reference the hub.
var chat = $.connection.myHub;
// Create a function that the hub can call to broadcast messages.
chat.client.addMessage = function (name, message) {
// Html encode display name and message.
var encodedName = $('<div />').text(name).html();
var encodedMsg = $('<div />').text(message).html();
// Add the message to the page.
$('#discussion').append('<li><strong>' + encodedName
+ '</strong>: ' + encodedMsg + '</li>');
};
// Get the user name and store it to prepend to messages.
$('#displayname').val(prompt('Enter your name:', ''));
// Set initial focus to message input box.
$('#message').focus();
// Start the connection.
$.connection.hub.start({withCredentials:true}).done(function () {
$('#sendmessage').click(function () {
// Call the Send method on the hub.
chat.server.send($('#displayname').val(), $('#message').val());
// Clear text box and reset focus for next comment.
$('#message').val('').focus();
});
});
});
Cookie 与最初返回它们的域相关联。浏览器不会在 server2.com 请求中发送来自 server1.com 的cookie,即使当前提供的页面来自 server1.com。这就是饼干的工作方式。将信息放在查询字符串中是正确的方法。