Cast Asp.Net API方法返回为HttpResponseMessage

时间:2012-11-26 18:21:41

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

在我学习和理解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);

1 个答案:

答案 0 :(得分: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