2

これは私に少し頭を悩ませています。最終的に、私は画像を返そうとしていますが、これを実験して文字列を使用するように単純化しました。

私が欲しいもの: 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

4

1 に答える 1