これは私に少し頭を悩ませています。最終的に、私は画像を返そうとしていますが、これを実験して文字列を使用するように単純化しました。
私が欲しいもの: URL に移動:
http://xxx/api/helloworld/1
「Hello world!」と応答します。
次の Web API 宣言は、指定された URL に対して機能します。
public string Get([FromUri]int id) { return "Hello World"; }
public Task<string> Get([FromUri]int id) { return "Hello World"; }
何が機能しないか;
public HttpResponseMessage Get([FromUri]int id)
{
return Request.CreateResponse<string>(HttpStatusCode.OK, "Hello World");
}
public HttpResponseMessage Get([FromUri]int id)
{
HttpResponseMessage response = new HttpResponseMessage();
string text = "Hello World";
MemoryStream test = new MemoryStream();
test.Write(ConversionUtilities.ToBytes(text) /*custom string->byte[] method, UTF-8 encoding*/, 0, text.Length);
response.Content = new StreamContent(test);
response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/plain");
response.StatusCode = HttpStatusCode.OK;
return response;
}
戻り値の型が HttpResponseMessage の Get() があると、次のエラーが返されます。
No HTTP resource was found that matches the request URI "http://xxx/api/helloworld/1"
このエラーは、この特定の戻り値の型に対してのみ表示されます。現在、WebApiConfig.cs ファイルでの私のルーティングは次のとおりです (「文字列」の戻り値の型で機能します)。
// Controller with ID
// To handle routes like "/api/VTRouting/1"
config.Routes.MapHttpRoute(
name: "ControllerAndId",
routeTemplate: "api/{controller}/{id}",
defaults: null,
constraints: new { id = @"^\d+$" } // Only integers
);
// Controllers with Actions
// To handle routes like "/api/VTRouting/route"
config.Routes.MapHttpRoute(
name: "ControllerAndAction",
routeTemplate: "api/{controller}/{action}"
);
// Controller Only
// To handle routes like "/api/VTRouting"
config.Routes.MapHttpRoute(
name: "ControllerOnly",
routeTemplate: "api/{controller}"
);
何かご意見は?戻り値の型の動作については困惑しています:-S