2

私は必死に Web API でプレーン (テキスト/プレーン) 文字列をアップロードしようとしていますが、コントローラーは単にルーティングを正しく行うことを拒否しています。私が得ているのは 404 (Not Found) HTTP エラーだけです (すべての「Get」メソッドがすぐに機能していてとてもうれしかったです :-( )

ここに私のルートがあります:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "IntegraApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
        config.Routes.MapHttpRoute(
            name: "ServComAdminApi",
            routeTemplate: "admin/{action}",
            defaults: new { controller = "admin", action = RouteParameter.Optional }
        );
        config.Routes.MapHttpRoute(
            name: "ServComApi",
            routeTemplate: "{id}/{action}",
            constraints: new { id = @"\d+" },
            defaults: new { controller = "servcom", action = "info" }
        );

        // Get rid of XML responses
        var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
        config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
    }
}

関連するルートは、「servcom」コントローラーにマップされる最後のルートです。そのルーティング パターン ("id/action") に従ったカスタム作成の HTTP サーバーを移植しています。すべての「get」メソッドで機能しています。次を使用するだけで、ID「10」の機器の「ユーザー」のリストを取得できますhttp://localhost:49410/10/users...しかし、「文字列データ」をアップロードしようとすると機能しません。これは私のコントローラーに適切な方法です:

public class ServcomController : ApiController
{
    [HttpPut, HttpPost]
    public string Vis(long idTerm)
    {
        return "PUT/POST Vis for: " + idTerm;
    }
}

必要最小限まで削ぎ落とされています。実際の文字列データを読んでさえいません。フォームでエンコードされたデータを送信するのではなく、単純な文字列 (この API は現在 3G で使用されているため、データ プランの使用を最小限に抑える必要があるため、バイトの節約は非常に重要です) を送信しないため、[FromBody] 属性を次のように使用しませんでした。まったく機能しません。

これは、テストに使用されるクライアント コードです。

using System;
using System.Net;

namespace TestPutPostString
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Sending 'HELLO WORLD!'");
            var wc = new WebClient();
            var res = wc.UploadString("http://localhost:49410/101/vis", "PUT", "HELLO WORLD!");
            Console.WriteLine("Response: " + res);
            Console.ReadKey(true);
        }
    }
}

「リモート サーバーがエラーを返しました: (404) 見つかりません」で失敗します。

上記のコードは、TcpServer を使用し、この API の特定のニーズに合わせてゼロから作成された、私の手書きの HTTP サーバーで完全に機能します (2 年間使用した後、ホストしやすくなるため、Web.API に移行しています) Azure ではこのようにします)。手書きの HTTP スタックでこの同じサンプル プログラムを使用すると、サーバーにヒットしたときのメッセージの本文には、実際に「HELLO WORLD!」が含まれます。ServComController.Vis() メソッドにルーティングされないのはなぜですか?

送り方が悪いのでしょうか?WebClient.UploadString() は他の予測できない方法で動作しますか? または、コントローラーメソッドの署名が間違っていますか? ルートが間違っていませんか?何が足りないの!?!? :-)

4

2 に答える 2