4

私はWebAPIルーティングの背後にある狂気を理解しようとしています。

このようなデータを投稿しようとすると:

curl -v -d "test" http://localhost:8088/services/SendData

404が表示され、次のエラーメッセージが表示されます。

{"Message":"No HTTP resource was found that matches the request URI 'http://localhost:8088/services/SendData'.","MessageDetail":"No action was found on the controller 'Test' that matches the request."}

これが私のテストサーバーのコードです。

public class TestController : ApiController
{

    [HttpPost]
    public void SendData(string data)
    {
        Console.WriteLine(data);
    }
}

class Program
{
    static void Main(string[] args)
    {

        var config = new HttpSelfHostConfiguration("http://localhost:8088");

        config.Routes.MapHttpRoute(
            name: "API Default",
            routeTemplate:"services/SendData",
            defaults: new { controller = "Test", action = "SendData"},
            constraints: null);

        using (var server = new HttpSelfHostServer(config))
        {
            server.OpenAsync().Wait();  
            Console.WriteLine("Press Enter to quit.");
            Console.ReadLine();
        }

    }
}

より一般的には、ASP.NETチームがMapHttpRouteメソッドを非常に混乱させることにしたのはなぜですか。なぜ2つの匿名オブジェクトが必要なのですか....これらのオブジェクトが実際に必要とするプロパティを誰かがどのように知っているのでしょうか?

MSDNはヘルプを提供しません:http://msdn.microsoft.com/en-us/library/hh835483 (v = vs.108).aspx

あなたが私に尋ねれば、動的にタイプされた言語のすべての苦痛は何の利益もありません...

4

3 に答える 3

8

あなたに同意します、それは狂気の地獄です、あなたはdataパラメータがPOSTペイロードからバインドされるべきであることを指定する必要があります、なぜならWebAPIはそれがクエリ文字列の一部であるべきだと自動的に仮定するからです(それは単純なタイプだからです):

public void SendData([FromBody] string data)

そして、狂気をさらに悪化させるには、POSTペイロードの前に=(ええ、それはタイプミスではなく、等号です):を付ける必要があります。

curl -v -d "=test" http://localhost:8088/services/SendData

あなたはで狂気についてもっと読むことができますthis article

または、狂気を止めて試してみてくださいServiceStack

于 2013-03-26T14:25:19.280 に答える
2

この署名を使用すると、毎回機能します。

public class TestController : ApiController
{
    [HttpPost]
    [ActionName("SendData")]
    public HttpResponseMessage SendData(HttpRequestMessage request)
    {
        var data = request.Content.ReadAsStringAsync().Result;
        Console.WriteLine(data);
    }
}
于 2013-03-26T15:28:18.650 に答える
0

次の変更を試してください、

public class TestController : ApiController
{
    [HttpPost]
    [ActionName("SendData")]
    public void SendData(string data)
    {
        Console.WriteLine(data);
    }
}

ActionName属性で問題が修正される場合があります。それ以外の場合は、命名規則「投稿」を使用することもできます

public void Post(string data)
{
   Console.WriteLine(data);
}

そして、SendDataなしでHttpPostを「サービス」に直接送信します。

于 2013-03-26T14:31:11.980 に答える