【问题标题】:Cast Asp.Net API methods return as HttpResponseMessageCast Asp.Net API 方法返回为 HttpResponseMessage
【发布时间】:2012-11-26 18:21:41
【问题描述】:

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

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

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

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

        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);

【问题讨论】:

  • 您是在尝试通过创建独立服务器并按照 Despertar 的建议发送实际的 HTTP 请求来创建集成测试,还是在创建单元测试以直接检查您的控制器代码?
  • 嗯,我希望我能做到,这样就可以在没有 HttpServer 的情况下调用它并获得有效的 HTTP 响应
  • 你需要一个正在运行的控制器实例,然后正如 Despertar 所建议的那样。
  • 因为只有在被有效的 HTTP 请求调用时才会正确填充响应?

标签: c# .net asp.net-mvc asp.net-web-api


【解决方案1】:

控制器方法不应该像那样直接调用。您必须发送 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

【讨论】:

  • 我不确定我是否同意不应该直接调用控制器方法,因为在某些情况下您应该调用它们但是我想要返回 HttpResponseMessage 但想知道是否可以在没有 HttpServer 的情况下完成
  • 同意乔恩的观点。你可能想要对你的控制器进行单元测试,然后这就会成为一个问题。
猜你喜欢
  • 2012-12-13
  • 2014-05-25
  • 1970-01-01
  • 1970-01-01
  • 2015-02-21
  • 2017-08-09
  • 2013-04-01
  • 2023-03-11
  • 2013-02-23
相关资源
最近更新 更多