2017-10-09 11 views
2

J'ai une méthode POST qui permet de publier des données parfaitement.HttpClient.PutAsync - "L'entité autorise uniquement les écritures avec un en-tête de type de contenu JSON"

En regardant docs, il semble qu'un PATCH (ou PUT) devrait ressembler à la même chose, il suffit d'utiliser PutAsync au lieu de PostAsync.

bien faire juste que je reçois l'erreur suivante:

+  postResponse {StatusCode: 400, ReasonPhrase: 'Bad Request', Version: 1.1, Content: System.Net.Http.NoWriteNoSeekStreamContent, Headers: 
{ 
    Cache-Control: private 
    Date: Mon, 09 Oct 2017 12:19:28 GMT 
    Transfer-Encoding: chunked 
    request-id: 60370069-f7c4-421d-842e-b1ee8573c2c2 
    client-request-id: 60370069-f7c4-421d-842e-b1ee8573c2c2 
    x-ms-ags-diagnostic: {"ServerInfo":{"DataCenter":"North Europe","Slice":"SliceB","ScaleUnit":"002","Host":"AGSFE_IN_7","ADSiteName":"DUB"}} 
    Duration: 3.2626 
    Content-Type: application/json 
}} System.Net.Http.HttpResponseMessage 

Et la réponse:

Entity only allows writes with a JSON Content-Type header

Et assez sûr dans l'erreur que je peux voir ceci:

ContentType {text/plain; charset=utf-8} System.Net.Http.Headers.MediaTypeHeaderValue 

Donc, l'erreur est logique, cependant, je lui dis d'utiliser JSON, et cela fonctionne comme prévu dans ma méthode POST avec la même morue e:

public async Task UpdateToGraph(object UnSerializedContent, string relativeUrl) 
{ 
    string accessToken = await _tokenManager.GetAccessTokenAsync(); 
    HttpContent content = new StringContent(JsonConvert.SerializeObject(UnSerializedContent)); 

    Client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); 
    Client.DefaultRequestHeaders.Add("ContentType", "application/json"); 

    string endpoint = "https://graph.microsoft.com/v1.0" + relativeUrl; 
    var postResponse = Client.PutAsync(endpoint, content).Result; 

    string serverResponse = postResponse.Content.ReadAsStringAsync().Result; 
} 

Répondre

3

Vous pouvez utiliser les méthodes .{Verb}AsJsonAsync HttpClientExtensions.

public async Task UpdateToGraph(object UnSerializedContent, string relativeUrl) { 
    var accessToken = await _tokenManager.GetAccessTokenAsync(); 

    Client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); 
    Client.DefaultRequestHeaders.Add("ContentType", "application/json"); 

    var endpoint = "https://graph.microsoft.com/v1.0" + relativeUrl; 
    var postResponse = await Client.PutAsJsonAsync(endpoint, UnSerializedContent); 

    var serverResponse = await postResponse.Content.ReadAsStringAsync(); 
} 

Notez également l'utilisation appropriée de async/attendre en ne mélangeant de blocage des appels comme .Result avec async méthodes, car cela peut conduire à des blocages.

Référence Async/Await - Best Practices in Asynchronous Programming

+0

Merci, 'HttpClient ne contient pas de définition pour PutAsJsonAsync', pense que je manque quelque chose? :) –

+0

@ Green_qaue vous manquez probablement une référence https://msdn.microsoft.com/en-us/library/system.net.httpclientextensions.putasjsonasync(v=vs.118).aspx – Nkosi

+0

Trouvé, merci :) Un autre problème est que si je supprime '.Result' je ne peux plus accéder à' postResponse.Content' –

1

Définissez le type de contenu à l'aide du constructeur StringContent:

HttpContent content = new StringContent(JsonConvert.SerializeObject(UnSerializedContent), System.Text.Encoding.UTF8, "application/json"); 

Pour autant que je sache, vous n'êtes pas censé définir l'en-tête de contenu sur l'objet de la demande lors de l'utilisation du HttpClient.