2016-11-17 3 views
0

Seule la méthode GET fonctionne tout le temps, mais elle est toujours erronée pour PUT, POST et DELETE. J'ai essayé de mettre à jour le mappeur via web.config ainsi que sous Site IIS. Initialement, je recevais une erreur avec le code d'état 405 comme méthode non autorisée. Lorsque j'ai changé la cartographie Handler commeErreur pour PUT, POST et DELETE RestAPI

<system.webServer> 
    <handlers> 
    <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
    <remove name="OPTIONSVerbHandler" /> 
    <remove name="TRACEVerbHandler" /> 
    <remove name="WebDAV" /> 
    <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 

    <remove name="ExtensionlessUrl-Integrated-4.0" /> 
    <add name="ExtensionlessUrl-Integrated-4.0" 
     path="*." 
     verb="GET,HEAD,POST,DEBUG,DELETE,PUT" 
     type="System.Web.Handlers.TransferRequestHandler" 
     preCondition="integratedMode,runtimeVersionv4.0" /> 
</handlers> 

<validation validateIntegratedModeConfiguration="false" /> 

<modules> 
    <remove name="ApplicationInsightsWebTracking" /> 
    <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" preCondition="managedHandler" /> 
    <remove name="WebDAVModule"/> 
</modules> 

a commencé obtenir erreur pour 415 comme "Type Unsupported Media" .Following est repsonce Je reçois

{StatusCode: 415, ReasonPhrase: « Type Unsupported Media », version: 1.1, contenu: System.Net.Http.StreamContent, en-têtes: { cache-Control: no-cache Pragma: no-cache serveur: Microsoft-IIS/8.5 X-réSEAU-version: 4.0 .30319 X-Powered-B y: ASP.NET Date: Thu, 17 Nov 2016 16:44:52 GMT Type de contenu: application/octet-stream; charset = utf-8 Expiration: -1 Longueur du contenu: 100 }}

. Voici mes APIcalls

// PUT: api/CreditRequests/5 
    [ResponseType(typeof(void))] 
    public IHttpActionResult PutCreditRequest(Guid id, CreditRequest creditRequest) 
    { 
     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 

     if (id != creditRequest.CreditRequestId) 
     { 
      return BadRequest(); 
     } 

     db.Entry(creditRequest).State = EntityState.Modified; 

     try 
     { 
      db.SaveChanges(); 
     } 
     catch (DbUpdateConcurrencyException) 
     { 
      if (!CreditRequestExists(id)) 
      { 
       return NotFound(); 
      } 
      else 
      { 
       throw; 
      } 
     } 

     return StatusCode(HttpStatusCode.NoContent); 
    } 

    // POST: api/CreditRequests 
    [ResponseType(typeof(CreditRequest))] 
    public IHttpActionResult PostCreditRequest(CreditRequest creditRequest) 
    { 
     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 

     db.CreditRequests.Add(creditRequest); 

     try 
     { 
      db.SaveChanges(); 
     } 
     catch (DbUpdateException) 
     { 
      if (CreditRequestExists(creditRequest.CreditRequestId)) 
      { 
       return Conflict(); 
      } 
      else 
      { 
       throw; 
      } 
     } 

     return CreatedAtRoute("DefaultApi", new { id = creditRequest.CreditRequestId }, creditRequest); 
    } 

    // DELETE: api/CreditRequests/5 
    [ResponseType(typeof(CreditRequest))] 
    public IHttpActionResult DeleteCreditRequest(Guid id) 
    { 
     CreditRequest creditRequest = db.CreditRequests.Find(id); 
     if (creditRequest == null) 
     { 
      return NotFound(); 
     } 

     db.CreditRequests.Remove(creditRequest); 
     db.SaveChanges(); 

     return Ok(creditRequest); 
    } 

Et je les appelle en utilisant l'objet HttpClient. avec le code comme

string jsondata = JsonConvert.SerializeObject(item); 
      var content = new StringContent(jsondata, System.Text.Encoding.UTF8, "application/json"); 
      HttpResponseMessage response = null; 
      using (var client = GetFormattedHttpClient())// Adding basic authentication in HttpClientObject before using it. 
      { 
       if (IsNew == true) 
        response = client.PostAsync (_webUri, content).Result; 
       else if (IsNew == false) 
        response = client.PutAsync(_webUri, content).Result; 

      } 
      if (!response.IsSuccessStatusCode) 
           return false; 
      else 
      return true; 
+0

Où avez-vous vu cette utilisation? '[ResponseType (typeof (void))]' ' –

+0

Je suis en train de tester la méthode POST pour ajouter le premier enregistrement dans DB. et dans le cas sur PUT je me concentre pour obtenir StatusCode comme NoContent –

+0

Supprimer cet attribut. Ce n'est pas nécessaire. – Amy

Répondre

0

Cela fonctionne pour moi.

protected async Task<String> connect(String URL,WSMethod method,StringContent body) 
{ 
     try 
     { 

      HttpClient client = new HttpClient 
      { 
       Timeout = TimeSpan.FromSeconds(Variables.SERVERWAITINGTIME) 
      }; 
      if (await controller.getIsInternetAccessAvailable()) 
      { 
       if (Variables.CURRENTUSER != null) 
       { 
        var authData = String.Format("{0}:{1}:{2}", Variables.CURRENTUSER.Login, Variables.CURRENTUSER.Mdp, Variables.TOKEN); 
        var authHeaderValue = Convert.ToBase64String(Encoding.UTF8.GetBytes(authData)); 

        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", authHeaderValue); 
       } 

       HttpResponseMessage response = null; 
       if (method == WSMethod.PUT) 
        response = await client.PutAsync(URL, body); 
       else if (method == WSMethod.POST) 
        response = await client.PostAsync(URL, body); 
       else 
        response = await client.GetAsync(URL); 

       .... 
}