LÖSCHEN/SETZEN Sie die Verben Folge 404 not Found in WebAPI, nur wenn lokal ausgeführt

Ich weiß, das ist ein allgemein Problem angesprochen, und ich habe alles getan, dass viele Beiträge hier SO vorschlagen. Wenn ich versuche, einen Datensatz löschen mit WebAPI (version 2) von meinem MVC5 Frontend läuft unter dem lokalen IIS, bekomme ich eine 404 not Found Antwort. Hier sind die Dinge, die ich versucht habe:

Habe ich Folgendes unter <system.webServer /> in meinen WebAPI web.config:

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

Ich habe die Anweisungen befolgt: http://geekswithblogs.net/michelotti/archive/2011/05/28/resolve-404-in-iis-express-for-put-and-delete-verbs.aspx, die im Grunde sagen zu ändern Sie die ExtensionlessUrlHandler-Integrated-4.0 im IIS "Handlerzuordnungen". Es sagt zu Doppel-klicken Sie auf den handler, klicken Sie auf "Einschränkungen", und "Erlauben, PUT-und DELETE-Verben". Ich habe dies getan, und ich bekomme immer noch die Fehlermeldung 404.

Ich getan habe, ein IIS-reset.

Hier mein MVC5 Frontend-code zum aufrufen der WebAPI delete-Methode - bitte beachten Sie, dass, wenn ich manuell navigieren Sie zu api/bulletinboard/get/{0} wo {0} ist eine ganze Zahl, bekomme ich einen gültigen JSON Antwort. Unten contactUri ist http://localhost/SiteName/api/bulletinboard/get/53 die gibt gültige JSON:

[HttpPost, ActionName("Delete")]
        public ActionResult Delete(string appId, int id)
        {
            response = client.GetAsync(string.Format("api/bulletinboard/get/{0}", id)).Result;
            contactUri = response.RequestMessage.RequestUri;
            response = client.DeleteAsync(contactUri).Result;

            if (response.IsSuccessStatusCode)
            {
                return RedirectToAction("MessageList", new { appId = appId });
            }
            else
            {
                LoggerHelper.GetLogger().InsertError(new Exception(string.Format(
                    "Cannot delete message due to HTTP Response Status Code not being successful: {0}", response.StatusCode)));
                return View("Problem");
            }
        }

Hier mein WebAPI Methode löschen:

[HttpDelete]
        public HttpResponseMessage Delete(int id)
        {
            BulletinBoard bulletinBoard = db.BulletinBoards.Find(id);
            if (bulletinBoard == null)
            {
                return Request.CreateResponse(HttpStatusCode.NotFound);
            }

            db.BulletinBoards.Remove(bulletinBoard);

            try
            {
                db.SaveChanges();
            }
            catch (DbUpdateConcurrencyException ex)
            {
                return Request.CreateErrorResponse(HttpStatusCode.NotFound, ex);
            }

            return Request.CreateResponse(HttpStatusCode.OK, bulletinBoard);
        }

Hier mein WebApiConfig.cs in meinen WebAPI-Projekt:

public static void Register(HttpConfiguration config)
        {
            //Web API configuration and services
            config.EnableCors();

            //Web API routes
            config.MapHttpAttributeRoutes();

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

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

            var json = config.Formatters.JsonFormatter;
            json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
            config.Formatters.Remove(config.Formatters.XmlFormatter);

            config.Formatters.Add(new PlainTextFormatter());
        }

FRAGE: Was kann ich sonst noch versuchen, um diesen Fehler zu beheben? Dies funktioniert gut, wenn Sie eingesetzt werden von meiner lokalen Umgebung auf meinem Entwicklungs-Server.

Ihre Anfrage-url api/bulletinboard/get/{0} in der Erwägung, dass Sie versuchen zu erreichen, die Aktion löschen...sollte es nicht api/bulletinboard/delete/{0}?
Nein, es sollte, wie ich es habe. Die DeleteAsync wird das Ergebnis der GET-Anforderung und löscht es. Ich habe diese arbeiten, wie in einem anderen Projekt. Jedoch habe ich es zu ändern, was Sie sagten, nur um zu sehen, was passieren würde, und ich hatte das gleiche 404-Fehler. Ich denke es ist etwas über das LÖSCHEN verlangen, dass der IIS nicht mag...
Ah, es ist eine sehr seltsame situation... werfen Sie einen Blick auf meine Antwort unten.

InformationsquelleAutor Mike Marks | 2014-01-15

Schreibe einen Kommentar