2016-01-17 3 views
2

мне удалось получить два ответа для одного веб-запроса:404 ответа прилагается к ответу WebAPI

  1. Мой WebAPI ответ (простая строка с кодом 200 статуса)
  2. 404, от того, что выглядит статический обработчик файлов

Скриншот из хрома:

Screen shot

Моя установка:

  • F #
  • Mono на Ubuntu 15,10
  • xsp4 как веб-сервер
  • Owin как механизм маршрутизации

Как вы можете видеть на скриншоте правильный ответ печатается (иногда - вздыхает) в первой строке ответа браузера, а затем сразу же следует на странице стандартной 404 страницей.

код

запуска:

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 

контроллер код:

[<RoutePrefix("api")>] 
type WordsearchController() = 
    inherit ApiController() 

    [<Route("")>] 
    member this.Get() = 
    this.Request.CreateResponse<string>(HttpStatusCode.OK, "This is my simple output") 

Я попытался удалить статический обработчик файлов в web.config, используя отображение маршрута MVC стиль в запуске и различные атрибуты маршрутизации для контроллера.

Просто кажется, что и webapi-маршрутизация, и статический обработчик файлов ОБА, помещая их два цента в ответ, вместо того, чтобы переопределить другой.

По просьбе @mark, запрос является простой GET для http://localhost:9000/api, и ответ:

HEADER

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) 
+0

Является ли код контроллера фактически отформатированным как отправленный? Потому что, если это так, я не вижу, как это можно скомпилировать. Учитывая, что F # является чувствительным к пробелу, при отправке кода убедитесь, что он правильно отформатирован. –

+0

Вместо публикации снимка экрана отправьте фактический HTTP-трафик (запрос и ответ). Из снимка экрана я не вижу, что такое ответ * на самом деле. HTTP 1.1 - простой текст, поэтому вы можете легко разместить его здесь. –

+0

Спасибо @mark. Я добавил подробный ответ и исправил отступы в коде. Спасибо за ваше время! –

ответ

0

Mono не поддерживает WebAPI асинхронный конвейер.

Я делаю запрос тяги для моно https://github.com/mono/mono/pull/3048. Это делает синхронное выполнение асинхронного веб-api-стека.

Теперь вы можете использовать асинхронный конвейер WebAPI с этим исправлением для Mono.

+0

Спасибо, Олег. Я жду слияния и освобождения с придуманным дыханием. –