在ASP.NET Web Api中测试HttpClient时的状态代码500

时间:2013-05-16 13:13:31

标签: asp.net-web-api httpclient

我正在尝试使用ASP.NET Web Api中的HttpClient来处理示例,但我在响应中收到状态代码500并且我不知道原因。

我在测试中有以下代码:

        var baseAddress = new Uri("http://localhost:54997");
        var config = new HttpSelfHostConfiguration(baseAddress);
        var server = new HttpSelfHostServer(config);

        ((HttpConfiguration)config).Routes.MapHttpRoute(
            name: "default",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new
            {
                id = RouteParameter.Optional
            });     

        using (var client = new HttpClient(server))
        {

            client.BaseAddress = baseAddress;
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            var response = client.GetAsync("/api/user/getUserDetails").Result;               
        }

我的控制器方法是这样的:

    [HttpGet]
    [ActionName("getUserDetails")]
    public string GetUserDetails()
    {
        return "hello";
    }

控制器动作在Fiddler中反应良好。

错误似乎在响应的Content属性中抛出。

[System.Net.Http.ObjectContent<System.Web.Http.HttpError>] = {System.Net.Http.ObjectContent<System.Web.Http.HttpError>}

我很遗憾没有太多事情要继续下去。

修改 请参阅下面的达林答案。我还把代码放在一个控制台应用程序中,它运行正常 - 为什么不在测试项目中?

有人能指出我可能出错的正确方向吗?

3 个答案:

答案 0 :(得分:2)

很奇怪,以下控制台应用程序对我来说非常合适:

using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Web.Http;
using System.Web.Http.SelfHost;

class Program
{
    static void Main(string[] args)
    {
        var baseAddress = new Uri("http://localhost:54997");
        var config = new HttpSelfHostConfiguration(baseAddress);
        var server = new HttpSelfHostServer(config);
        ((HttpConfiguration)config).Routes.MapHttpRoute(
            name: "default",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        using (var client = new HttpClient(server))
        {
            client.BaseAddress = baseAddress;
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            var response = client.GetAsync("/api/user/getUserDetails").Result;
            Console.WriteLine(response.Content.ReadAsStringAsync().Result);
        }
    }
}

public class UserController : ApiController
{
    [HttpGet]
    [ActionName("getUserDetails")]
    public string GetUserDetails()
    {
        return "hello";
    }
}

您可以检查服务器返回的响应文本,以查看是否可以收集有关该问题的更多信息:

Console.WriteLine(response.Content.ReadAsStringAsync().Result);

答案 1 :(得分:1)

这种内存中托管的东西很棒。 BUT .....

似乎如果您正在测试的控制器在您的应用配置中使用任何内容,它就会失败。出于某种原因,我的内存服务器为所有人返回空值; web配置中的app配置值。

有没有人知道如何让HttpServer读取这些内容?

在IIS express中托管时工作正常....我只在内存中托管时才会看到问题。

帮助! :)

答案 2 :(得分:0)

我不确定为什么Self主机服务器在您的测试项目中出现故障,但您实际上并不需要它。使用内存主机尝试以下操作:

    var config = new HttpConfiguration();
    var server = new HttpServer(config);

    ((HttpConfiguration)config).Routes.MapHttpRoute(
        name: "default",
        routeTemplate: "api/{controller}/{action}/{id}",
        defaults: new
        {
            id = RouteParameter.Optional
        });     

    using (var client = new HttpClient(server))
    {

        client.BaseAddress = baseAddress;
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        var response = client.GetAsync("/api/user/getUserDetails").Result;               
    }