2016-10-19 2 views
0

die folgende Methode in einem API-Controller in einem selbst gehosteten OWIN Anwendung Gegeben:OWIN Route erfordert (any) Querystring für POST?

  • http://localhost:8080/foo
  • :

    [HttpPost] 
    [Route("~/foo")] 
    public HttpResponseMessage Foo([FromBody]SomeClass data) 
    { 
        //...implementation here 
    } 
    

    Posting zum der folgenden URI die Foo() Methode nicht aufrufen http://localhost:8080/foo/

Posting auf die folgende URI nicht aufrufen die Foo() Methode:

  • http://localhost:8080/foo?
  • http://localhost:8080/foo?bar
  • http://localhost:8080/foo?bar=baz

Ich möchte die 'nackten' URI posten können http://localhost:8080/foo

Was mache ich falsch? (Natürlich habe ich MapHttpAttributeRoutes() bei der Initialisierung des Dienstes aufgerufen).


aktualisieren 1

Seltsam. Ich habe den folgenden (self-contained) Testfall:

using Microsoft.Owin.Hosting; 
using Owin; 
using System; 
using System.Collections.Specialized; 
using System.Net; 
using System.Net.Http; 
using System.Web.Http; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var server = WebApp.Start("http://+:8080", (appBuilder) => 
     { 
      var config = new HttpConfiguration(); 
      config.MapHttpAttributeRoutes(); 

      appBuilder.UseWebApi(config); 
      config.EnsureInitialized(); 
     }); 

     var postdata = new NameValueCollection(); 
     postdata["data"] = "testing"; 

     var testurls = new[] { 
      "http://localhost:8080/foo", 
      "http://localhost:8080/foo/", 
      "http://localhost:8080/foo?", 
      "http://localhost:8080/foo?x", 
      "http://localhost:8080/foo?x=y", 
     }; 

     foreach (var url in testurls) 
     { 
      try 
      { 
       using (var w = new WebClient()) 
        w.UploadValues(url, postdata); 
       Console.WriteLine($"OK : {url}"); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine($"FAIL: {url} ({ex.Message})"); 
      } 
     } 
    } 
} 

public struct MyData 
{ 
    public string Data { get; set; } 
} 

public class TestController : ApiController 
{ 
    [HttpPost] 
    [Route("foo")] 
    public HttpResponseMessage Foo([FromBody]MyData postdata) 
    { 
     Console.WriteLine($"POST: {postdata.Data}"); 
     return new HttpResponseMessage(HttpStatusCode.OK); 
    } 
} 

Ausgang:

POST: testing 
OK : http://localhost:8080/foo 
POST: testing 
OK : http://localhost:8080/foo/ 
POST: testing 
OK : http://localhost:8080/foo? 
POST: testing 
OK : http://localhost:8080/foo?x 
POST: testing 
OK : http://localhost:8080/foo?x=y 

Also gibt es etwas anderes in meinem eigentlichen Projekt, das diese bricht. Jetzt den Unterschied zu finden ...


aktualisieren 2

Never mind. Das Problem lag in der (Client-) Anwendung, die in meinem Dienst gepostet wurde, nicht im Dienst selbst.

Antwort

0

Siehe meine aktualisierte Frage. Ich bin ein Idiot. Das Problem lag in der Bewerbung, die an meinen OWIN-Dienst gesendet wurde, nicht an den OWIN-Dienst selbst. Der Code ist korrekt, der Client hatte einen Fehler in der Art und Weise, wie der URI erstellt wurde.

Verwandte Themen