404 answer added to webapi answer

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:

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) =
    // Configure routing
    config.MapHttpAttributeRoutes()
    // Configure serialization
    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
) &lt;0x403b0a40 + 0x00733&gt; in &lt;filename unknown&gt;:0 
  at System.Web.DefaultHttpHandler.BeginProcessRequest (System.Web.HttpContext context, System.AsyncCallback
 callback, System.Object state) &lt;0x403b0240 + 0x00153&gt; in &lt;filename unknown&gt;:0 
  at System.Web.HttpApplication+&lt;Pipeline&gt;c__Iterator1.MoveNext () &lt;0x40332110 + 0x04416&gt
; in &lt;filename unknown&gt;:0 
  at System.Web.HttpApplication.Tick () &lt;0x40330c60 + 0x00057&gt; in &lt;filename unknown&gt;: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>

<!--
[System.Web.HttpException]: Path &#39;/api&#39; was not found.
  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 
-->


1 request

5.0 KB

2ms (onload: 88ms)
+2
1

WebAPI.

pull https://github.com/mono/mono/pull/3048. -api-.

WebAPI Mono.

0

Source: https://habr.com/ru/post/1623052/


All Articles