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 aufrufenhttp://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.