Die Frage ist kein Duplikat davon, obwohl die erwähnte Frage einige sehr interessante Antworten hat und mir geholfen hat, mein Problem besser zu verstehen, aber sie erfüllt nicht meine Bedürfnisse. Lassen Sie mich mein Szenario erklären.
Ich habe eine asp.net mvc-Website mit Benachrichtigungsfunktion und Echtzeit-Datenaktualisierungen durch SignalR- und SQL-Abhängigkeit. Die Benutzerauthentifizierung erfolgt mithilfe von Identity 2.0. Nur autorisierte Benutzer dürfen die aktualisierten Daten/Benachrichtigungen sehen. Außerdem variieren die Benachrichtigungen/Updates von Benutzer zu Benutzer. Ich habe dies erreicht, indem ich einen benutzerdefinierten UserId-Anbieter implementiert und die UserId von Identity verwendet habe.
Nun möchte ich folgende Ziele erreichen.
-
Einfacher Teil: Zeigen Sie den Inhalt der Seite (Dashboard) in anderen Websites an, unabhängig von ihrer Entwicklungssprache. Es kann in eine bestehende Seite eingefügt werden oder wo immer sie (andere Websites) wollen.
-
Schwieriger Teil: Zeigen Sie die Echtzeit-Benachrichtigungen und -Updates für den integrierten Teil basierend auf dem angemeldeten Benutzer an.
Was wäre die beste Vorgehensweise in diesem Szenario?
Aktualisieren
Da die ursprüngliche Frage zurückgestellt wurde, weil die Details nicht angegeben wurden, sind hier die Details, zu denen ich Vorschläge erhalten möchte.
Ich habe eine asp.net mvc-Website, auf der ausgeführt wird lokaler Host: 54603Im Folgenden ist die Aktion des Home-Controllers
public ActionResult Index()
{
HttpContext.Response.AppendHeader("Access-Control-Allow-Origin", "*");
return View();
}
Die Indexansicht enthält einige signalR-Funktionen. Unten ist die Startkonfiguration von signalR, um CORS zuzulassen, da mein Ziel darin besteht, die Indexseite und ihre gesamte Funktionalität für Clients verfügbar zu machen (Ausführen von PHP usw.).
app.Map("/signalr", map =>
{
map.UseCors(CorsOptions.AllowAll);
var hubConfiguration = new HubConfiguration
{
// You can enable JSONP by uncommenting line below.
// JSONP requests are insecure but some older browsers (and some
// versions of IE) require JSONP to work cross domain
// EnableJSONP = true
};
map.RunSignalR(hubConfiguration);
});
Ich habe NotificationHub erstellt und im Folgenden ist mein Code am Frontend (mit Proxy).
<script>
$(function () {
// Reference the auto-generated proxy for the hub.
$.connection.notificationHub.url="http://localhost:54603/signalr";
var notification = $.connection.notificationHub;
// Client side method for receiving the list of notifications on the connected event from the server
notification.client.refreshNotification = function (data) {
$("#notificationTab").empty();
$("#cntNotifications").text(data.length);
for (var i = 0; i < data.length; i++) {
$("#notificationTab").append("<tr> <td> " + data[i].Id + "</td> <td>" + data[i].Text + "</td> <td>" + data[i].CreatedDate + "</td></tr>");
}
}
//Client side method which will be invoked from the Global.asax.cs file.
notification.client.addLatestNotification = function (data) {
$("#cntNotifications").text($("#cntNotifications").text() + 1);
$("#notificationTab").append("<tr> <td> " + data.Id + "</td> <td>" + data.Text + "</td> <td>" + data.CreatedDate + "</td></tr>");
}
// Start the connection.
$.connection.hub.start().done(function () {
//When the send button is clicked get the text and user name and send it to server.
$("#btnSend").click(function () {
notification.server.sendNotification($("#text").val(), $("#userName").val());
});
console.log($.connection.hub.id);
}).fail(function (data) { console.log('Could not connect' + data); });
});
</script>
und HTML folgt
@{
ViewBag.Title = "Home Page";
Layout = null;
}
<link href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://code.jquery.com/jquery-1.11.2.min.js"></script>
<script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
<script src="http://ajax.aspnetcdn.com/ajax/signalr/jquery.signalr-2.2.0.min.js"></script>
<script src="@Url.Content("~/signalr/hubs")"></script>
@*<script src="~/signalr/hubs"></script>*@
<div style="width: 70%; padding: 20px">
<div class="panel panel-primary">
<div class="panel-heading">
<! – To show notification count-->
<div style="float: left" class="panel-title">Notifications</div>
<div style="float: right" class="badge" id="cntNotifications"></div>
<div style="clear: both"></div>
</div>
<div class="panel-body">
<! – To show All the notifications-->
<table class="table table-striped table-hover ">
<thead>
<tr>
<th>#</th>
<th>Text</th>
<th>Created Date</th>
</tr>
</thead>
<tbody id="notificationTab"></tbody>
</table>
</div>
</div>
<! – Add panel notification to send notification, Make sure that user enters the user id of the domain they are logged into -->
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">Create Notifications</h3>
</div>
<div class="panel-body">
<div class="form-group">
<label class="control-label" for="focusedInput">Notification Text</label>
<input class="form-control" id="text" type="text" value="">
</div>
<div class="form-group">
<label class="control-label" for="focusedInput">Send To</label>
<input class="form-control" id="userName" type="text" value="">
</div>
<a id="btnSend" style="cursor: pointer" class="btn btn-primary">Send Notification</a>
</div>
</div>
</div>
Die Seite läuft wie erwartet einwandfrei und die Verbindungs-ID wird in der Konsole angemeldet.
Jetzt habe ich eine weitere HTML-Seite erstellt und es folgt ihr Code
<html>
<head>
<link href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://code.jquery.com/jquery-1.11.2.min.js"></script>
<script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
<script src="http://ajax.aspnetcdn.com/ajax/signalr/jquery.signalr-2.2.0.min.js"></script>
</head>
<body>
<aside>
<div class="col-lg-2">
<ul>
<li>this</li>
<li>is</li>
<li>aside</li>
</ul>
</div>
</aside>
<article>
<div class="col-lg-10">
<div id="something">
</div>
</div>
</article>
<script src="http://localhost:54603/signalr/hubs"></script>
<script>
$(document).ready(function () {
$.ajax({
url: "http://localhost:54603/Home/Index",
dataType: 'html',
crossDomain: true,
cache:true
}).done(function (data) {
$('#something').html(data);
});
});
</script>
</body>
</html>
Die Ajax-Anforderung gibt den HTML-Code zurück, aber der signalR löst einen Fehler aus. Im Folgenden sind die Konsolenmeldungen aufgeführt.
ERHALTEN http://localhost:54603/Home/Index 200 OK 1,18 s
Verbindung konnte nicht hergestellt werden. Fehler: Fehler während der Verhandlungsanforderung.
Was mache ich falsch, was diesen Fehler verursacht?
Ich persönlich finde, dass diese Frage zu weit gefasst ist. Zu viele Sprachen, zu viele mögliche Lösungen, zu viele Fragen :(. Es wäre besser, wenn Sie eine bestimmte Sache aufschreiben würden, was Sie bisher versucht haben und was der Sturz war, den Sie überwinden möchten. Sie können es verwenden SignalR domänenübergreifendHilft das?
– Lukas
13. Oktober 2015 um 12:49 Uhr
Ich stimme zu und natürlich wäre es am besten, sich etwas Allgemeines auszudenken, aber für den Anfang nehmen wir an, der Client ist PHP, wo es integriert werden soll. Irgendwelche Vorschläge dazu?
– Rollo
13. Oktober 2015 um 12:51 Uhr
Nun, SignalR Cross-Domain verwendet JavaScript auf der Clientseite und CORS auf der Serverseite, sodass Sie dort abgedeckt sind. Sie könnten ganz einfach eine JavaScript-Datei erstellen, die ohne Änderungen am PHP-Code eine Verbindung mit dem SignalR-Kanal herstellen kann, außer um das JavaScript in die Seite des Clients einzufügen.
– Lukas
13. Oktober 2015 um 12:53 Uhr
Kann ich den Code am Client-Ende weiter minimieren, indem ich nur einen einzigen Ajax-Treffer auf meinen eigenen Server (natürlich CORS) mache, der in Bezug auf HTML und Skripte usw. zurückgibt, die in HTML eingefügt würden. Da ich keine großen Änderungen vornehmen möchte, wenn es in WordPress usw. integriert wird. Irgendwelche möglichen Nachteile bei diesem Ansatz? Wie sollte ich vorgehen, um die Authentifizierung zu implementieren? Der Benutzer wird bei der PHP-Site angemeldet und ich muss mich von meiner Datenbank aus authentifizieren.
– Rollo
13. Oktober 2015 um 13:05 Uhr
Ja, Sie könnten ganz einfach ein Skript auf Ihrem Server erstellen, das alles Erforderliche auf die Seite des Clients zieht. Wenn das Skript von Ihrem eigenen Server ausgeführt wird, brauchen Sie sich meiner Meinung nach nicht einmal um CORS zu kümmern, da es sich nicht um Cross-Site-Skripting handelt (das enthaltene Skript gehört Ihrer Domain). Ich denke, das bedeutet auch, dass Sie davon Gebrauch machen können Ihre Authentifizierung auch, würden Sie sie mit Ihrem mitgelieferten Skript über eine Anfrage an Ihre Domain authentifizieren? Das Authentifizierungsbit ist ein bisschen kompliziert und ich bin mir da nicht sicher. Vielleicht können andere helfen.
– Lukas
13. Oktober 2015 um 13:10 Uhr