Réponse 404 ajoutée à la réponse webapi

J’ai réussi à obtenir DEUX réponses pour une seule requête Web:

  1. Ma réponse webapi (une chaîne simple avec 200 codes de statut)
  2. un 404, de ce qui ressemble à un gestionnaire de fichiers statique

Capture d’écran de chrome:

Capture d'écran

Ma configuration est la suivante:

  • F#
  • Mono sur Ubuntu 15.10
  • xsp4 comme serveur web
  • Owin comme moteur de routage

Comme vous pouvez le voir sur la capture d’écran, la réponse correcte est imprimée (parfois – soupira) sur la première ligne de la réponse du navigateur, puis immédiatement suivie sur la page par la page 404 standard.

Code de démarrage:

type Startup() = static member RegisterWebApi(config: HttpConfiguration) = // Configure routing config.MapHttpAtsortingbuteRoutes() // Configure serialization config.Formatters.XmlFormatter.UseXmlSerializer <- true config.Formatters.JsonFormatter.SerializerSettings.ContractResolver  ignore builder.UseErrorPage() |> ignore 

Code du contrôleur:

 [] type WordsearchController() = inherit ApiController() [] member this.Get() = this.Request.CreateResponse(HttpStatusCode.OK, "This is my simple output") 

J’ai essayé de supprimer le gestionnaire de fichiers statique dans le fichier web.config, en utilisant le mappage de routage de style MVC au démarrage et divers atsortingbuts de routage pour le contrôleur.

Il semble juste que le routage webapi et le gestionnaire de fichiers statiques soient tous les deux en train de mettre leurs deux cents dans la réponse, au lieu d’en substituer un.

Selon la demande de @mark, la demande est un simple GET à http: // localhost: 9000 / api , et la réponse est:

ENTÊTE

 HTTP/1.0 404 Not Found Date: Mon, 18 Jan 2016 00:11:17 GMT Server: Mono.WebServer.XSP/4.2.0.0 Linux X-AspNet-Version: 4.0.30319 Content-Length: 5085 Cache-Control: private Content-Type: text/html Keep-Alive: timeout=15, max=94 Connection: Keep-Alive 

CORPS

 GET api 404 Not Found localhost:9000 5.0 KB 127.0.0.1:9000 2ms HeadersResponseHTMLCache This is my simple output     body { background-color: #FFFFFF; font-size: .75em; font-family: Verdana, Helvetica, Sans-Serif; margin : 0; padding: 0; color: #696969; } a:link { color: #000000; text-decoration: underline; } a:visited { color: #000000; } a:hover { color: #000000; text-decoration: none; } a:active { color: #12eb87; } p, ul { margin-bottom: 20px; line-height: 1.6em; } pre { font-size: 1.2em; margin-left: 20px; margin-top: 0px; } h1, h2, h3, h4, h5, h6 { font-size: 1.6em; color: #000; font-family: Arial, Helvetica, sans-serif; } h1 { font-weight: bold; margin-bottom: 0; margin-top: 0; padding-bottom: 0; } h2 { font-size: 1em; padding: 0 0 0px 0; color: #696969; font-weight: normal; margin-top: 0; margin-bottom : 20px; } h2.exceptionMessage { white-space: pre; } h3 { font-size: 1.2em; } h4 { font-size: 1.1em; } h5, h6 { font-size: 1em; } #header { position: relative; margin-bottom: 0px; color: #000; padding: 0; background-color: #5c87b2 ; height: 38px; padding-left: 10px; } #header h1 { font-weight: bold; padding: 5px 0; margin: 0; color: #fff; border: none; line-height: 2em ; font-family: Arial, Helvetica, sans-serif; font-size: 32px !important; } #header-image { float: left; padding: 3px; margin-left: 1px; margin-right: 1px; } #header-text { color: #fff; font-size: 1.4em; line-height: 38px; font-weight: bold; } #main { padding: 20px 20px 15px 20px; background-color: #fff; _height: 1px; } #footer { color: #999; padding: 5px 0; text-align: left; line-height: normal; margin: 20px 0px 0px 0px ; font-size: .9em; border-top: solid 1px #5C87B2; } #footer-powered-by { float: right; } .details { font-family: monospace; border: solid 1px #e8eef4; white-space: pre; font-size: 1.2em; overflow : auto; padding: 6px; margin-top: 6px; background-color: #eeeeff; color: 555555 } .details-wrapped { white-space: normal } .details-header { margin-top: 1.5em } .details-header a { font-weight: bold; text-decoration: none } p { margin-bottom: 0.3em; margin-top: 0.1em } .sourceErrorLine { color: #770000; font-weight: bold; }   var hideElementsById = new Array (); window.onload = function () { if (!hideElementsById || hideElementsById.length < 1) return; for (index in hideElementsById) toggle (hideElementsById [index]); } function toggle (divId) { var e = document.getElementById (divId); if (!e) return; var h = document.getElementById (divId + "Hint"); if (e.style.display == "block" || e.style.display == "") { e.style.display = "none"; if (h) h.innerHTML = " (click to show)"; } else { e.style.display = "block"; if (h) h.innerHTML = " (click to hide)"; } }  Error 404   

System.Web.HttpException

The resource cannot be found.

Description: HTTP 404.The resource you are looking for (or one of its dependencies ) could have been removed, had its name changed, or is temporarily unavailable. Please review the following URL and make sure that it is spelled correctly.

Details: Requested URL: /api

Exception stack trace:
at System.Web.StaticFileHandler.ProcessRequest (System.Web.HttpContext context ) <0x403b0a40 + 0x00733> in <filename unknown>:0 at System.Web.DefaultHttpHandler.BeginProcessRequest (System.Web.HttpContext context, System.AsyncCallback callback, System.Object state) <0x403b0240 + 0x00153> in <filename unknown>:0 at System.Web.HttpApplication+<Pipeline>c__Iterator1.MoveNext () <0x40332110 + 0x04416&gt ; in <filename unknown>:0 at System.Web.HttpApplication.Tick () <0x40330c60 + 0x00057> in <filename unknown>:0
<!-- [System.Web.HttpException]: Path '/api' was not found. at System.Web.StaticFileHandler.ProcessRequest (System.Web.HttpContext context) in :0 at System.Web.DefaultHttpHandler.BeginProcessRequest (System.Web.HttpContext context, System.AsyncCallback callback, System.Object state) in :0 at System.Web.HttpApplication+c__Iterator1.MoveNext () in :0 at System.Web.HttpApplication.Tick () in :0 --> 1 request 5.0 KB 2ms (onload: 88ms)

Mono ne prend pas en charge le pipeline asynchrone WebAPI.

Je fais une demande de tirage pour mono https://github.com/mono/mono/pull/3048 . Il effectue l’exécution synchrone de la stack d’API Web asynchrone.

Vous pouvez maintenant utiliser le pipeline asynchrone WebAPI avec ce correctif pour Mono.