2016-07-11 6 views
0

Consum verbrauchen Alle Ich bin neu in WebAPI2. Ich möchte Daten von einer Funktion im JSON-Format konsumieren, aber Fehler werfen StatusCode: 403, ReasonPhrase: 'ModSecurity Action'. Ich kann direkt vom Browser aus konsumieren, kann aber nicht vom HttpClient. Keine Sicherheit implementiert.Wie WebAp2 ohne jede Authentifizierung in C#

Funktioniert perfekt auf lokalen Server, aber über Fehler wirft auf remote freigegebenen Server. APIURL. http://api.owncircles.com/api/Circles/Education/Questions/getAns/2012460157

API-Funktionscode.

[HttpGet()] 
[AllowAnonymous] 
[Route("~/api/Circles/Education/Questions/getAns/{quesID}")] 
public IHttpActionResult getAns(string quesID) 
{ 
    IQuestions objQuestion = Questions.getInatance(); 
    var qtn = objQuestion.getAns(quesID); 
    return Json(qtn); 
} 

Client Side

[AllowAnonymous] 
public async Task<ActionResult> checkAns(string id) 
{ 
    string url = common.apiURL + "Circles/Education/Questions/getAns/"+id; 
    //HttpClient client = new HttpClient(new HttpClientHandler() {UseDefaultCredentials = true }); 
    HttpClient client = new HttpClient(); 

    // client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(Constants.)); 
    // client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(""); 
    // client.DefaultRequestHeaders.Authorization = null; 
    client.BaseAddress = new Uri(url); 
    client.DefaultRequestHeaders.Accept.Clear(); 
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
    ent_QuestionsDetails Questions = null; 
    var response = await client.GetAsync(url); 
    if (response.IsSuccessStatusCode) 
    { 
     Questions = response.Content.ReadAsAsync<ent_QuestionsDetails>().Result; 
    } 
    OC.Models.mod_Questions objModel = new OC.Models.mod_Questions(); 
    objModel.questionID = Questions.questionID; 
    objModel.questions = Questions.questions; 
    objModel.questionOptions = Questions.questionOptions; 
    return View(objModel); 
} 
+0

Wenn die Antwort unten Ihre Frage beantwortet, vergessen Sie bitte nicht, sie als solche zu markieren. – Igor

Antwort

1

Es scheint, seine Ihre User-Agent, wenn dieser die Anfrage abgelehnt wird weggelassen wird. Wenn Sie den Wert des Chrome-Benutzeragenten in der Kopfzeile nachahmen, wird die Anforderung erfolgreich ausgeführt. Hier ist ein eigenständiges Arbeitsbeispiel:

Beachten Sie, dass dieses Beispiel nicht await nicht verwendet/Asynchron wie es in einer Konsole App getestet

using (HttpClient client = new HttpClient()) 
{ 
    client.BaseAddress = new Uri("http://api.owncircles.com/"); 
    client.DefaultRequestHeaders.Clear(); 
    client.DefaultRequestHeaders.Accept.ParseAdd("application/json"); 
    client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"); 

    var result = client.GetAsync("api/Circles/Education/Questions/getAns/2012460157").Result; 

    if(result.IsSuccessStatusCode) 
     Console.Write(result.Content.ReadAsStringAsync().Result); 
    else 
     Console.Write("fail"); 
} 

Davon abgesehen weiß ich nicht, welche Art von Kontrolle Sie haben eine API-Server-Seite auf dem Benutzer-Agent, die eine Anfrage ablehnen würde.

+0

Vielen Dank, Sie sind Zauberer oder Ihre Magie war in UserAgent Inhalt versteckt. Diese UserAgent-Syntax für alle gängigen Browser oder für jeden Browser verfügt über separaten Code. – Own

+0

@Own - überprüfen Sie diese [Ressource aus] (https://en.wikipedia.org/wiki/User_agent). Ich kann Ihnen nicht alles sagen, was möglich ist, es hängt vom Agenten ab und es gibt viele und sie ändern sich auch, wenn die Versionen inkrementiert werden. – Igor