0

在我尝试学习和理解 WebAPI 的过程中,我想我已经了解到 APIController 方法的返回值被包装到 HttpResponseMessage 中。

您还可以选择创建一个新的 HttpResponseMessage 并将其放入List<Product>其中。

例如,我对测试标头感兴趣,如果我用下面的代码传入一个接受标头,我想测试响应中返回的内容类型。

我知道我总是可以返回一个 HttpResponseMessage,因为严格来说这就是它的作用,但我只是想知道是否有一种方法可以将来自控制器方法的响应作为 HttpResponseMessage 转换回,而不必创建一个 HttpServer/HttpConfiguration 设置,如此处所示

        var config = new HttpConfiguration();


        var request = new HttpRequestMessage(HttpMethod.Post, "http://localhost/api/products");
        request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        var route = config.Routes.MapHttpRoute(
         name: "DefaultApi",
         routeTemplate: "{controller}"
            );

        var routeData = new HttpRouteData(route, new HttpRouteValueDictionary { { "controller", "GetData" } });
        var controller = new GetDataController();
        controller.ControllerContext = new HttpControllerContext(config, routeData, request);
        controller.Request = request;
        controller.Request.Properties[HttpPropertyKeys.HttpConfigurationKey] = config;

        /************************* HELP!!!***************/
        // If Get returns List<Product> can I cast it as HttpResponseMessage??
        /************************************************/

        var result = controller.Get();

        // Assert
        Assert.Equal("application/json", result.Content.Headers.ContentType.MediaType);
4

1 回答 1

2

控制器方法不应该像那样直接调用。您必须发送 HTTP 请求才能获得 HTTP 响应。尝试使用

HttpResponseMessage response = HttpClient.SendAsync(request).Result;

尽管如果您不在 IIS 中托管,则必须创建一个HttpSelfHostServer以在进程内托管控制器,以便它可以侦听请求。这将向您展示如何做到这一点,http://www.asp.net/web-api/overview/hosting-aspnet-web-api/self-host-a-web-api

于 2012-11-26T18:42:20.733 回答