2016-07-31 6 views
0

Derzeit gibt die Web-API, die die Oracle-DB abfragt, das Ergebnis in JSON im folgenden Format zurück.ASP.NET-Web-API Gibt JSON als Objekt zurück

[{"CATEGORY":"Internal Study","SESSION_NUMBER":7,"SESSION_START_DATE":"2015-02-13T00:00:00","SESSION_START_TIME":"2015-02-13T10:33:59.288394"}] 

Unten ist der Code, den wir

public class SampleController : ApiController 
{ 
    public HttpResponseMessage Getdetails([FromUri] string[] id) 
    { 
    using (OracleConnection dbconn = new OracleConnection("DATA SOURCE=J;PASSWORD=C;PERSIST SECURITY INFO=True;USER ID=T")) 
     { 
    var inconditions = id.Distinct().ToArray(); 
    var srtcon = string.Join(",", inconditions); 
    DataSet userDataset = new DataSet(); 
    var strQuery = @"SELECT * from STCD_PRIO_CATEGORY where STPR_STUDY.STD_REF IN(" + srtcon + ")"; 
    OracleCommand selectCommand = new OracleCommand(strQuery, dbconn); 
    OracleDataAdapter adapter = new OracleDataAdapter(selectCommand); 
    DataTable selectResults = new DataTable(); 
    adapter.Fill(selectResults); 
    var response = Request.CreateResponse(HttpStatusCode.OK, selectResults,MediaTypeHeaderValue.Parse("application/json")); 
    ContentDispositionHeaderValue contentDisposition = null; 
    if (ContentDispositionHeaderValue.TryParse("inline; filename=ProvantisStudyData.json", out contentDisposition)) 
    { 
     response.Content.Headers.ContentDisposition = contentDisposition; 
    } 
    return response; 
} 
} 

Aber der Kunde, die das Script hat, die die Datei sagt verbraucht verwenden, dass JSON Struktur statt eines Objekts ein Array ist ein Sicherheitsloch.

{"data":[{"CATEGORY":"Internal Study","SESSION_NUMBER":7,"SESSION_START_DATE":"2015-02-13T00:00:00","SESSION_START_TIME":"2015-02-13T10:33:59.288394"}]} 

Ich bin neu in dieser JSON-Struktur und nicht sicher, wie wir die zurückgegebenen Daten als ein Objekt in JSON Datei

+0

Was meinst du mit "Client" hier? Wer sagt, dass dies ein Sicherheitsloch ist? – DavidG

+0

Ich sehe, dass die oberste jetzt die zurückgegebene ist, die untere ist, was Sie wollen: P Die Sicherheitslücke besteht darin, dass ein JSON-Array der obersten Ebene entführt werden kann, da es ein gültiges JavaScript-Skript ist, das kein JSON-Objekt ist . – starlight54

+0

@ starlight54 Bist du sicher? http://stackoverflow.com/questions/16289894/is-json-hijacking-still-an-issue-in-moder-browser – DavidG

Antwort

4

Ich habe nicht jedes Sicherheitsproblem um ein Array im JSON zu hören manipulieren aber wenn Sie es zu einem JSON-Objekt konvertieren können Sie ein generisches Objekt verwenden, die Sie definieren:

var returnObject = new 
{ 
    selectResults = selectResults 
}; 

Dies wird das JSON-Objekt hinzufügen, die Sie auf die Antwort wollen Verpackung, die Sie dann diesen Code verwenden Erstellen Sie Ihre Antwort:

var response = Request.CreateResponse(HttpStatusCode.OK, returnObject,MediaTypeHeaderValue.Parse("application/json")); 

Entschuldigung, wenn ich missverstanden habe, worum du bittest - hoffe das hilft/funktioniert.

+0

Danke. Aber weisen wir selectResults sich selbst zu? Auch es sagt Typ erwartet in der neuen() – trx

+0

Sorry, der Code, den ich zur Verfügung gestellt hatte ein extra '()' drin nach dem 'neuen' - das ist nicht erforderlich; Ich habe meine Lösung geändert, um dies zu beheben und es sollte jetzt funktionieren, ich habe es selbst ausprobiert. Auch - die 'selectResults', die im neuen Objekt zugewiesen wird, ist der Name der JSON-Eigenschaft; in "{" data ": [{" CATEGORY ":" Interne Studie "," SESSION_NUMBER ": 7," SESSION_START_DATE ":" 2015-02-13T00: 00: 00 "," SESSION_START_TIME ":" 2015-02-13T10 : 33: 59.288394 "}]}" wäre es in der Position, in der das 'Daten' -Tag ist. – jthomperoo

+0

Fast, um den Namen in Daten zu ändern, ändern Sie Ihren Code wie folgt: var returnObject = new {data = selectResults}; Dadurch wird der Name des JSON-Objekts in "Daten" geändert. – jthomperoo

Verwandte Themen