私は必死に 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() は他の予測できない方法で動作しますか? または、コントローラーメソッドの署名が間違っていますか? ルートが間違っていませんか?何が足りないの!?!? :-)