2017-10-31 4 views
0

ich den OData-Service haben, um eine PUT wir den Header mit If-Match: * im Posten Mann, den ich wie unten geben und es funktioniertEinstellen der If-Match im Header C#

enter image description here

festlegen müssen auszuführen

Wie kann ich dieses If-Match in dem OData-Service-Aufruf 501:Not Implemented

01 die unter

private async Task<HttpResponseMessage> PutJsonAsync(string messageBody,string B_Code) 
{ 
string userName = ConfigurationManager.AppSettings["Username"]; 
string password = ConfigurationManager.AppSettings["Password"]; 
string BaseURL = ConfigurationManager.AppSettings["BaseURL"]; 

    try 
{ 
    using (var httpClient = new HttpClient()) 
    { 
    var request = new StringContent(messageBody, Encoding.UTF8, "application/json"); 
    string apiUrl = "SAM('" + B_Code + "')"; 
    request.Headers.ContentType = new MediaTypeHeaderValue("application/json"); 
    request.Headers.TryAddWithoutValidation("If-Match", "*"); 
    var url = string.Format("{0}{1}", BaseURL, apiUrl); 
    var creds = userName + ":" + password; 
    var credentials = Encoding.ASCII.GetBytes(creds); 
    httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(credentials)); 

    response = await httpClient.PutAsync(new Uri(url), request); 
} 
} 
catch (Exception ex) 
{ 
throw ex; 
    } 
    return response; 
    } 

Aber es und wirft Fehler nicht funktioniert ein PUT operation.I versucht auszuführen gesetzt

`Antwort {Statuscode: 501, ReasonPhrase: 'Nicht implementiert', Version: 1.1, Inhalt: System.Net.Http.StreamContent, Sockel:

OData-Version: 4.0 Datum: Mo, 30. Oktober 2017 20 : 42: 28 GMT Set-Cookie: JSESSIONID = XYZ; Pfad = /; Sichern; Httponly Set-Cookie: XYZ; path = /; SICHERE; Httponly Server: Apache-Coyote/1.1 Vary: Accept-Encoding Verbindung: Keep-Alive- Content-Length: 277 Content-Type: application/json; odata.metadata = minimal }} System.Net.Http.HttpResponseMessage`

+0

@John aktualisiert meine Frage – xyz

+0

Sind Sie den Inhaltstyp auf Ihren Content-Objekt einstellen? Ich bin mir nicht sicher, ob Sie es auf die Anforderungsheader setzen sollen. – john

+0

@John Ich folgte der Antwort für die Frage hier https://StackOverflow.com/Questions/31437925/How-Cani-i-Include-If-None-Match-Header-in-HTTPrequestmessage – xyz

Antwort

2

Ihr "Anfrage" -Objekt ist Ihr Inhaltsobjekt, nicht das HttpRequestMessage-Objekt. Wie habe ich das erkannt? ContentType ist in der HttpRequestMessage nicht verfügbar.

If-Match ist kein Content-Level-Header (ich weiß nicht, warum Microsoft diese Unterscheidung machen). Sie können es hier nicht hinzufügen, Sie müssen es dem Anforderungsheader hinzufügen. Wenn Sie es zum Inhaltsobjekt hinzufügen, wird es ignoriert.

So etwas sollte funktionieren:

string apiUrl = "SAM('" + B_Code + "')"; 
var url = string.Format("{0}{1}", BaseURL, apiUrl); 
var creds = userName + ":" + password; 
var credentials = Encoding.ASCII.GetBytes(creds); 
var request = new HttpRequestMessage(HttpMethod.Put, new Uri(url)); 
request.Content = new StringContent(messageBody, Encoding.UTF8, "application/json"); 
request.Headers.TryAddWithoutValidation("If-Match", "*"); 
request.Headers.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(credentials)); 

response = await httpClient.SendAsync(request); 
+0

Ich denke, ich mache das gleiche. Es tut uns leid, dass Sie den gesamten Code nicht gepostet haben. Ich habe meine Frage bearbeitet. Aber es funktioniert nicht und wirft 501 Fehlerstatuscode – xyz

+0

@xyz Nein, StringContent ist ein _content_ Objekt. Sie fügen If-Match zu Ihrem Inhaltsobjekt hinzu. Sie können 'httpClient.DefaultRequestHeaders 'verwenden.TryAddWithoutValidation', aber ich würde das Gegenteil empfehlen und empfehle, stattdessen eine Anfrage wie oben zu erstellen. Es wird empfohlen, einen einzelnen statischen HttpClient zu erstellen (gemäß den MSDN-Dokumenten und [this] (https://aspnetmonsters.com/2016/08/08-08-27-httpclientwrong/)). – john

+0

@xyz Ich habe meine Antwort bearbeitet, um nun Ihr spezifisches Szenario einzubeziehen, nachdem Sie den Code eingefügt haben. – john

Verwandte Themen