I managed to get TWO responses for one web request:
- My webapi answer (simple line with status code 200)
- a 404, from what looks like a static file handler
Chrome Screenshot:

My setup:
- F #
- Mono on Ubuntu 15.10
- xsp4 as a web server
- Owin as a routing mechanism
As you can see in the screenshot, the correct answer is printed (sometimes sighs) in the first line of the browser response, and then immediately displayed on the page using the standard 404 page.
Launch Code:
type Startup() =
static member RegisterWebApi(config: HttpConfiguration) =
config.MapHttpAttributeRoutes()
config.Formatters.XmlFormatter.UseXmlSerializer <- true
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver <- Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver()
member __.Configuration(builder: IAppBuilder) =
let config = new HttpConfiguration()
Startup.RegisterWebApi(config)
builder.UseWebApi(config) |> ignore
builder.UseErrorPage() |> ignore
Controller Code:
[<RoutePrefix("api")>]
type WordsearchController() =
inherit ApiController()
[<Route("")>]
member this.Get() =
this.Request.CreateResponse<string>(HttpStatusCode.OK, "This is my simple output")
I tried to remove the static file handler in the web.config file using MVC style route mapping at startup and various routing attributes for the controller.
, webapi, , , , .
@mark GET http://localhost:9000/api, :
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
GET api
404 Not Found
localhost:9000
5.0 KB
127.0.0.1:9000
2ms
HeadersResponseHTMLCache
<string>This is my simple output</string><?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional
.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<style type="text/css">
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; }
</style>
<script type="text/javascript">
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)";
}
}
</script>
<title>Error 404</title>
</head>
<body>
<div class="page">
<div id="header">
<div id="header-text">Application Exception</div>
</div>
<div id="main">
<h1>System.Web.HttpException</h1>
<h2 class="exceptionMessage">The resource cannot be found.</h2>
<p><strong>Description:</strong> 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.</p><p><strong>Details:</strong> Requested URL: /api
</p>
<div><strong>Exception stack trace:</strong></div>
<div class="details"> 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 <
/div><div id="footer">
<div style="color:Black;"><strong>Version Information:</strong> <tt>4.2.1 (Stable 4.2.1.102/6dd2d0d
Thu Nov 12 09:52:44 UTC 2015)</tt>; ASP.NET Version: <tt>4.0.30319.17020</tt></div>
<div id="footer-powered-by">Powered by <a href="http://mono-project.com/">Mono</a></div>
</div>
</div>
</div>
</body>
</html>
1 request
5.0 KB
2ms (onload: 88ms)