2016-11-24 10 views
2

Ich habe eine Webapi-Controller-Klasse mit unterschiedlichen Maßnahmen, GET und PUT funktionieren gut, POST ist die ganze Zeit fehlgeschlagen und ich bin ziemlich frustriert. Vielleicht können Sie mir ein paar Tipps geben, wie ich dieses Problem lösen kann.C# Webapi POST Anfrage fehlgeschlagen - 404 nicht gefunden

Controller Aktion:

[RoutePrefix("api/v1/jobs")] 
public class JobsController : ApiController 
{ 
    [ActionName("PostInactiveStatus")] 
    [System.Web.Http.AcceptVerbs("POST")] 
    [System.Web.Http.HttpPost] 
    public IHttpActionResult PostInactiveStatus(Job job) 
    { 
     CsJobSchedulerEntities dataContext = new CsJobSchedulerEntities(); 
     try 
     { 
      var refJob = (from j in dataContext.Job 
          where j.JOB_ID == job.JOB_ID 
          select j).SingleOrDefault(); 

      refJob.JOB_ACTIVE = 0; 
      refJob.JOB_MUSER = job.JOB_MUSER; 
      refJob.JOB_MDATE = DateTime.Now;    

      dataContext.SaveChanges(); 

      var jobs = dataContext.Job.ToList(); 
      return Ok(jobs); 
     } 
     catch (Exception ex) 
     { 
      return ResponseMessage(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, new HttpError(ex.Message))); 

     } 

    } 
} 

WebapiConfig Klasse:

public static void Register(HttpConfiguration config) 
{ 
    config.MapHttpAttributeRoutes(); 

    config.Routes.MapHttpRoute(
     name: "DefaultApi", 
     routeTemplate: "api/{controller}/{action}/{key}", 
     defaults: new { key = RouteParameter.Optional } 
    ); 

    //PAM: Add Default Message Handler when Content-Type is Empty 
    config.MessageHandlers.Add(new DefaultContentTypeMessageHandler()); 

    //PAM: Web API configuration and services 
    EnableCrossSiteRequests(config); 

} 

private static void EnableCrossSiteRequests(HttpConfiguration config) 
{ 
    var cors = new EnableCorsAttribute(
     origins: "*", 
     headers: "*", 
     methods: "*"); 
    config.EnableCors(cors); 
} 

Client Request:

function removeJob(data) { 

    jQuery.support.cors = true; 
    $.ajax({ 
     url: HOST + "api/v1/jobs/PostInactiveStatus", 
     type: "Post", 
     data: data, 
     async: false, 
     beforeSend: function() { 

     }, 
     success: function (data) { 

     }, 
     error: function (xhr, ajaxOptions, thrownError) { 

     } 
    }); 
} 

}

Http Request Network request

Fehlermeldung:

"Message": "Nein HTTP-Ressource wurde gefunden, dass die Anforderungs-URI http://localhost:59732/api/v1/jobs/PostInactiveStatus übereinstimmt.", "MessageDetail": „Kein Typ gefunden wurde, die den Controller 'genannt Spiele v1 '. "

Wo ich versage?

UPDATE: Der Controller hat den RoutePrefix für die Versionierung der API hinzugefügt, da GET und PUT einwandfrei funktionieren.

+0

Gut für eine basierend auf Route Vorlage gibt es keine v1. Wie lautet der Name des Controllers, der die obige Aktion – Nkosi

Antwort

2

den Namen des Controllers Unter der Annahme JobsController und dass die Route Vorlage im OP definiert

config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{action}/{key}", 
    defaults: new { key = RouteParameter.Optional } 
); 

genau ist, dann den Ajax-Aufruf aktualisiert Route Vorlage Übereinstimmen

erwartet
url: HOST + "api/jobs/PostInactiveStatus", 

Andere weisen Für diese URL müsste eine neue Route definiert werden, die v1 in der Routenvorlage

config.MapHttpAttributeRoutes(); 

config.Routes.MapHttpRoute(
    name: "V1Api", 
    routeTemplate: "api/v1/{controller}/{action}/{key}", 
    defaults: new { key = RouteParameter.Optional } 
); 

config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{action}/{key}", 
    defaults: new { key = RouteParameter.Optional } 
); 
enthält

UPDATE

basierend auf hinzugefügte Informationen, die Route Attribut für die Aktion fehlt. schließe es in die Aktion ein.

[RoutePrefix("api/v1/jobs")] 
public class JobsController : ApiController { 
    //POST api/v1/jobs/PostInactiveStatus 
    [ActionName("PostInactiveStatus")] 
    [System.Web.Http.AcceptVerbs("POST")] 
    [System.Web.Http.HttpPost] 
    [Route("PostInactiveStatus")] //<-- this was missing 
    public IHttpActionResult PostInactiveStatus(Job job) { ...} 
} 
+0

hat? Er konnte auch versuchen, der API-Methode das Attribut 'Route' hinzuzufügen. '[Route (" api/v1/jobs/PostInactiveStatus ")]' – esiprogrammer

+0

Ja, aber OP zeigte nicht an, ob Attribut-Routing auf den Controller angewendet wurde. – Nkosi

+0

Ich habe ein Update hinzugefügt, ich verwende den Routeprefix auf Controller-Ebene für Versionierungszwecke. – user12282