So integrieren Sie die asp.net mvc-Seite, die signalR enthält, mit anderen Plattformen

Lesezeit: 9 Minuten

Benutzer-Avatar
rollo

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">

            <! &ndash; 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">
            <! &ndash; 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>

    <! &ndash; 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.
Geben Sie hier die Bildbeschreibung ein

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

Benutzer-Avatar
Lukas

Es ist schwierig, genau festzulegen, was Sie tun müssen, da die Frage ziemlich weit gefasst ist, aber ich hoffe, dass diese Punkte etwas helfen:

SignalR domänenübergreifend verwendet JavaScript auf der Clientseite und CORS auf der Serverseite, sodass Sie an dieser Front 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.

Sie könnten ganz einfach ein einzelnes Skript auf Ihrem Server erstellen, auf das der Client auf seiner Seite verweisen kann und das alles Erforderliche auf die Seite des Clients zieht. Da das Skript von Ihrem eigenen Server aus ausgeführt wird, müssen Sie sich meiner Meinung nach keine Gedanken über CORS machen, da es sich nicht wirklich um “Site-übergreifendes Skripting” handelt, da der Code, der die Anforderungen ausführt, Ihrem Server/Ihrer Domäne “gehört”.

Was die Authentifizierung angeht, wenn nur Ihr Skript Zugriff auf die Authentifizierung benötigt, bedeutet dies meiner Meinung nach, dass Sie auch die Authentifizierung Ihrer Domain verwenden können (Cookies usw.). Ich müsste dies jedoch überprüfen. Letztendlich würden Sie sie mit einer HTTPs-Anfrage an Ihre Domain aus dem enthaltenen Skript authentifizieren?

Hier sind einige nützliche Threads, die dabei helfen könnten:

  • Domänenübergreifende Cookies
  • Erstellen eines JavaScript-Cookies auf einer Domain und Lesen über Subdomains hinweg

1205750cookie-checkSo integrieren Sie die asp.net mvc-Seite, die signalR enthält, mit anderen Plattformen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy