我会尽量精确: 我的情况是这样的: 我在我的网站上使用在线支付提供商(DK中的Quickpay)。他们在我的付款电话中提供了一个回拨网址,当付款通过时,他们的服务器会调用该网址。在他们的文档中,他们声明这是对支付处理的强制性答案首选的方法。我还在付款通知中提供“继续网址”,当付款处理完毕后,付款API会通过付款API调用该网址。他们声明这不应该被用作更新我的订单的强制性答案,因为网址可以被篡改,更像是一种通知用户的方式。这一切都有道理。 现在我的问题是这个设置。
用户在我的网站上为服务创建在线支付。 付款随“继续URL”一起提供,该URL由我提供的参数命中。
点击asp.net视图“Continue URL”,然后我开始与信号r hub建立新连接。当连接开始时,我启动一个ajax调用,如果回调URL已经更新了订单,它将查看我的数据库。如果是,它会显示一个div,表示“Thanx for your order”。但是,如果尚未从回调URL异步处理付款。我不会显示“谢谢”div,只是等待服务器连接到我的信号r hub,并为我提供答案。这一切都是为了应对竞争条件。 每当Ajax调用返回“尚未更新”,并且我等待服务器时,服务器将永远不会连接到集线器。我很确定我正在运行一些连接限制。 这是客户端代码:
jQuery(document).ready(function () {
var payment = $.connection.paymentHub;
payment.client.paymentSuccess = function () {
$('#paymentSuccess').show();
$('#paymentWaitingForConfirmation').hide();
};
$.connection.hub.start().done(function () {
payment.server.joinCompany($("#Company_Id").val());
var data = { companyId: $("#Company_Id").val(), paymentSource: $("#PaymentSource").val()};
$.ajax({
data: data,
type: 'POST',
url: '/Payment/CheckStatus',
success: function (response) {
if (response.Status === 200) {
$('#paymentSuccess').show();
$('#paymentWaitingForConfirmation').hide();
NProgress.done(true);
}
}
});
});
回调函数通过以下代码调用集线器:
var hubConnection = new HubConnection("[my url]");
IHubProxy paymentHubProxy = hubConnection.CreateHubProxy("PaymentHub");
hubConnection.Start().Wait();
paymentHubProxy.Invoke("JoinCompany", responseFromPayment.CompanyId.ToString()).Wait();
paymentHubProxy.Invoke("PaymentSuccess", responseFromPayment.CompanyId.ToString(),
PaymentSource.sms).Wait();
我之间有日志,我在数据库中看到的最后一件事就是在开始调用之后。 我有一个单元测试成功地从回调中执行代码,所以没有问题。 一切都是从外部通过我的IP和DNS中的URL,对于端口80上的流量,到我的本地IIS以使其工作。 操作系统是Windows 10 IIS 10,信号r版本2.2.0,浏览器是Chrome版本48.0.2564.97
我真的希望你们能帮助我。
我添加了一些追踪,这就是我得到的回复。我不太明白:
I enabled trace on the connection: this is what i got back:
20:35:37.3524239 - c33fab7f-f4fa-44c9-9443-51384e4606ca - SSE: OnMessage(Data: {})
20:35:27.3529777 - c33fab7f-f4fa-44c9-9443-51384e4606ca - SSE: OnMessage(Data: {})
20:35:17.3511832 - c33fab7f-f4fa-44c9-9443-51384e4606ca - SSE: OnMessage(Data: {})
20:35:07.3518849 - c33fab7f-f4fa-44c9-9443-51384e4606ca - SSE: OnMessage(Data: {})
20:34:57.3368445 - c33fab7f-f4fa-44c9-9443-51384e4606ca - SSE: OnMessage(Data: {})
20:34:47.3207855 - c33fab7f-f4fa-44c9-9443-51384e4606ca - SSE: OnMessage(Data: {})
20:34:42.9706258 - c33fab7f-f4fa-44c9-9443-51384e4606ca - SSE: OnMessage(Data: {"C":"d-C4BA6FA7-B,0|G,0|H,1","S":1,"M":[]})
20:34:42.9679338 - c33fab7f-f4fa-44c9-9443-51384e4606ca - SSE: OnMessage(Data: initialized)
20:34:42.9614299 - c33fab7f-f4fa-44c9-9443-51384e4606ca - SSE: GET http://[url]/signalr/connect?clientProtocol=1.4&transport=serverSentEvents&connectionData=[{"Name":"PaymentHub"}]&connectionToken=ZH2%2F1lMBXHDY%2FYwdazoMS5h0VvFvoP6OZrDYOzbc0TFG%2FcEgK7tn9pJnVRPk5OmL%2FCqXxvxDcI4p6dxPKNXg57a%2Fpmtk29Ba2cqJGEREr0ljZjfH0WcBzL1RklBgtCj%2F
20:34:42.9248908 - null - ChangeState(Disconnected, Connecting)
答案 0 :(得分:0)
由于您正在使用.Wait();
,因此您认为自己陷入僵局。使您的方法异步并改为使用await
。详情请见here。
答案 1 :(得分:0)
我只是把它扔到那里因为这个问题的标题似乎在询问连接限制。请参阅有关并发限制的部分。 http://www.niceonecode.com/Q-A/DotNet/SignalR/How-to-improve-Signalr-performance/20303