J’ai réussi à obtenir DEUX réponses pour une seule requête Web:
- Ma réponse webapi (une chaîne simple avec 200 codes de statut)
- un 404, de ce qui ressemble à un gestionnaire de fichiers statique
Capture d’écran de chrome:
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> ; 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.