Meine ASP.NET MVC-App wird in einem IFrame gehostet. Aufgrund der langen Antwortzeit des Servers zeige ich im Beitrag ein Wartesymbol an. Das heißt, mein Beitrag basiert auf jQuery und JSON zu und von meinem Controller. Das Ausführen meiner ASP.NET MVC-App funktioniert eigenständig einwandfrei, jedoch überhaupt nicht innerhalb eines Iframes.
Der IFrame befindet sich in einer benutzerdefinierten Visualisierung in PowerBI.
In Global.asax habe ich diesen Code:
AntiForgeryConfig.SuppressXFrameOptionsHeader = true;
In meinem Controller habe ich Folgendes entfernt:
[ValidateAntiForgeryToken]
Meiner Ansicht nach habe ich Folgendes entfernt:
@Html.AntiForgeryToken()
Beim Posten erhalte ich diese Antwortfehler
OPTIONEN
https://myurl/Edit/707057500079987300 401 (Nicht autorisiert )
Antwort auf eine Preflight-Anfrage besteht die Zugriffskontrollprüfung nicht: Auf der angeforderten Ressource ist kein Header „Access-Control-Allow-Origin“ vorhanden. Der Zugriff auf Origin „null“ ist daher nicht gestattet. Die Antwort hatte den HTTP-Statuscode 401.
Ich habe meinen Controller und meine Ansicht geändert, um eine GET-Anfrage zu verwenden. Aber das gleiche Ergebnis, http-Fehler 401.
Mein Ziel ist nicht, dass Site A mit Site B interagiert, sondern es nur anzuzeigen.
Site B, meine ASP.NET MVC-App, soll einige serverseitige Aufgaben erledigen und das Ergebnis anzeigen.
Durch Festlegen von AntiForgeryConfig.SuppressXFrameOptionsHeader = true und Die Bestätigung, dass ich dachte, meine Ziele seien entfernt, wurde entfernt machbar.
Die Anfrage:
OPTIONS /AENettMicrofunctions/InstantReading/GetDetails/707057500079332843 HTTP/1.1
Host: aensmartgrid.ae.no
Connection: keep-alive
Access-Control-Request-Method: GET
Origin: null
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36
Access-Control-Request-Headers: x-requested-with
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: nb-NO,nb;q=0.9,no;q=0.8,nn;q=0.7,en-US;q=0.6,en;q=0.5
Die Antwort
HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/8.5
X-AspNetMvc-Version: 5.2
X-AspNet-Version: 4.0.30319
Persistent-Auth: true
X-Powered-By: ASP.NET
Date: Thu, 21 Jun 2018 13:59:02 GMT
ntCoent-Length: 5015
Content-Encoding: gzip
Content-Length: 1651
Wie unten vorgeschlagen, habe ich Folgendes zu web.config hinzugefügt
Was mache ich hier falsch?
Warum ist das http-Verb OPTION, wenn es in der jQuery eindeutig ein GET ist? Was fehlt mir?
Der Code für meine Ansicht ist unten.
Grüße
Frode
@model AE.Net.MicrofunctionViews.Models.InstantReadingRequest
@{
ViewBag.Title = "Momentanavlesning spenning";
}
@Html.ValidationSummary(false, "", new { @class = "text-danger" })
@Html.Label("model.UsagePoint", "Målepunkt: ")
@Html.DisplayFor(model => model.UsagePoint)
@Html.HiddenFor(model => model.UsagePoint, "UsagePointId")
@Html.Label("model.ReadingResult", "Resultat: ")
@Html.TextAreaFor(model => model.ReadingResult, new { @cols = "50", @rows = "4" })
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
$(document).ready(function () {
// Hide the "busy" Gif at load:
$("#divProcessing").show();
$("#divData").hide();
$("#GreenSmiley").hide();
$("#RedSmiley").hide();
var usagePointId = $("#UsagePoint").val();
var url = "@Url.Action("GetDetails", "InstantReading")/" + usagePointId;
$.ajax({
url: url,
type: "GET",
dataType: "json",
success: function (resp) {
// Hide the "busy" gif:
$("#divProcessing").hide();
$("#divData").show();
if (resp.errors) {
var $summaryUl = $(".validation-summary-valid").find("ul");
$summaryUl.empty();
$.each(resp.errors,
function (a, b) {
$summaryUl.append($("").text(b.Errors[0].ErrorMessage));
});
}
else {
$("#ReadingResult").val(resp.ReadingResult);
var ResultHaveVoltageReading = resp.ResultHaveVoltageReading;
if (ResultHaveVoltageReading) {
var ResultVoltageReadingIsOk = resp.ResultVoltageReadingIsOk;
if (ResultVoltageReadingIsOk) {
$("#GreenSmiley").show();
}
else {
$("#RedSmiley").show();
}
}
}
},
error: function (xhr) {
$("#divProcessing").hide();
$("#divData").show();
$("#ReadingResult").val(xhr.val);
}
})
});
}
Meine ASP.NET MVC-App wird in einem IFrame gehostet. Aufgrund der langen Antwortzeit des Servers zeige ich im Beitrag ein Wartesymbol an. Das heißt, mein Beitrag basiert auf jQuery und JSON zu und von meinem Controller. Das Ausführen meiner ASP.NET MVC-App funktioniert eigenständig einwandfrei, jedoch überhaupt nicht innerhalb eines Iframes.
Der IFrame befindet sich in einer benutzerdefinierten Visualisierung in PowerBI.
In Global.asax habe ich diesen Code:
AntiForgeryConfig.SuppressXFrameOptionsHeader = true;
In meinem Controller habe ich Folgendes entfernt:
[ValidateAntiForgeryToken]
Meiner Ansicht nach habe ich Folgendes entfernt:
@Html.AntiForgeryToken()
Beim Posten erhalte ich diese Antwortfehler
OPTIONEN https://myurl/Edit/707057500079987300 401 (Nicht autorisiert )
Antwort auf eine Preflight-Anfrage besteht die Zugriffskontrollprüfung nicht: Auf der angeforderten Ressource ist kein Header „Access-Control-Allow-Origin“ vorhanden. Der Zugriff auf Origin „null“ ist daher nicht gestattet. Die Antwort hatte den HTTP-Statuscode 401.
Ich habe meinen Controller und meine Ansicht geändert, um eine GET-Anfrage zu verwenden. Aber das gleiche Ergebnis, http-Fehler 401.
Mein Ziel ist nicht, dass Site A mit Site B interagiert, sondern es nur anzuzeigen.
Site B, meine ASP.NET MVC-App, soll einige serverseitige Aufgaben erledigen und das Ergebnis anzeigen.
Durch Festlegen von AntiForgeryConfig.SuppressXFrameOptionsHeader = true und Die Bestätigung, dass ich dachte, meine Ziele seien entfernt, wurde entfernt machbar.
Die Anfrage:
OPTIONS /AENettMicrofunctions/InstantReading/GetDetails/707057500079332843 HTTP/1.1
Host: aensmartgrid.ae.no
Connection: keep-alive
Access-Control-Request-Method: GET
Origin: null
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36
Access-Control-Request-Headers: x-requested-with
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: nb-NO,nb;q=0.9,no;q=0.8,nn;q=0.7,en-US;q=0.6,en;q=0.5
Die Antwort
HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/8.5
X-AspNetMvc-Version: 5.2
X-AspNet-Version: 4.0.30319
Persistent-Auth: true
X-Powered-By: ASP.NET
Date: Thu, 21 Jun 2018 13:59:02 GMT
ntCoent-Length: 5015
Content-Encoding: gzip
Content-Length: 1651
Wie unten vorgeschlagen, habe ich Folgendes zu web.config hinzugefügt
Was mache ich hier falsch?
Warum ist das http-Verb OPTION, wenn es in der jQuery eindeutig ein GET ist? Was fehlt mir?
Der Code für meine Ansicht ist unten.
Grüße
Frode
@model AE.Net.MicrofunctionViews.Models.InstantReadingRequest
@{
ViewBag.Title = "Momentanavlesning spenning";
}
@Html.ValidationSummary(false, "", new { @class = "text-danger" })
@Html.Label("model.UsagePoint", "Målepunkt: ")
@Html.DisplayFor(model => model.UsagePoint)
@Html.HiddenFor(model => model.UsagePoint, "UsagePointId")
[img]~/Content/ajax-loader.gif[/img]
@Html.Label("model.ReadingResult", "Resultat: ")
[img]~/Content/GreenSmiley.jpg[/img]
[img]~/Content/RedSmiley.jpg[/img]
@Html.TextAreaFor(model => model.ReadingResult, new { @cols = "50", @rows = "4" })
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
$(document).ready(function () {
// Hide the "busy" Gif at load:
$("#divProcessing").show();
$("#divData").hide();
$("#GreenSmiley").hide();
$("#RedSmiley").hide();
var usagePointId = $("#UsagePoint").val();
var url = "@Url.Action("GetDetails", "InstantReading")/" + usagePointId;
$.ajax({
url: url,
type: "GET",
dataType: "json",
success: function (resp) {
// Hide the "busy" gif:
$("#divProcessing").hide();
$("#divData").show();
if (resp.errors) {
var $summaryUl = $(".validation-summary-valid").find("ul");
$summaryUl.empty();
$.each(resp.errors,
function (a, b) {
$summaryUl.append($("").text(b.Errors[0].ErrorMessage));
});
}
else {
$("#ReadingResult").val(resp.ReadingResult);
var ResultHaveVoltageReading = resp.ResultHaveVoltageReading;
if (ResultHaveVoltageReading) {
var ResultVoltageReadingIsOk = resp.ResultVoltageReadingIsOk;
if (ResultVoltageReadingIsOk) {
$("#GreenSmiley").show();
}
else {
$("#RedSmiley").show();
}
}
}
},
error: function (xhr) {
$("#divProcessing").hide();
$("#divData").show();
$("#ReadingResult").val(xhr.val);
}
})
});
}