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

Asp.net web api 在ASP.NET Web Api中测试HttpClient时的状态代码500,asp.net-web-api,httpclient,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(c

我正在尝试使用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>}
[System.Net.Http.ObjectContent]={System.Net.Http.ObjectContent}
对不起,这没什么好谈的

编辑 请参见下面Darin的回答。我还将代码放在控制台应用程序中,效果很好——那么为什么不放在测试项目中呢?


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

奇怪的是,下面的控制台应用程序对我来说非常好:

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

奇怪的是,以下控制台应用程序对我来说非常好:

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

我不确定为什么自主机服务器在您的测试项目中失败,但您确实不需要它。使用内存中的主机尝试以下操作:

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

我不确定为什么自主机服务器在您的测试项目中失败,但您确实不需要它。使用内存中的主机尝试以下操作:

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

这个内存托管的东西太棒了。但是

看起来,如果您正在测试的控制器使用了应用程序配置中的任何内容,它就会失败。出于某种原因,我的内存中服务器返回所有的空值;web.config中的应用程序配置值

有人知道让HttpServer读取这些内容的方法吗

它在IIS express中托管时工作正常…我只在内存中托管时看到问题


救命!:)

这个内存托管的东西太棒了。但是

看起来,如果您正在测试的控制器使用了应用程序配置中的任何内容,它就会失败。出于某种原因,我的内存中服务器返回所有的空值;web.config中的应用程序配置值

有人知道让HttpServer读取这些内容的方法吗

它在IIS express中托管时工作正常…我只在内存中托管时看到问题


救命!:)

打开跟踪并添加ConsoleListener,您应该可以看到问题出现的位置。在获得上述代码中的响应后,是否可以执行
response.Content.ReadAsStringAsync().Result
以查看有关错误的更多详细信息?另外,如果没有错误详细信息,是否可以尝试将错误详细信息策略设置为Always
config.IncludeErrorDetailPolicy=IncludeErrorDetailPolicy.Always
(这与本地主机无关,但您可以尝试一下)请看我在这里的问答:您的基址和相对URI的尾随斜杠和前导斜杠错误。打开跟踪并添加ConsoleListener,您应该可以看到问题出现的位置。在上面的代码中获得响应后,您可以执行
response.Content.ReadAsStringAsync()吗.Result
查看是否获得有关错误的更多详细信息?另外,如果没有错误详细信息,是否可以尝试将错误详细信息策略设置为Always
config.IncludeErrorDetailPolicy=IncludeErrorDetailPolicy.Always
(这与本地主机无关,但您可以尝试一下)看看我在这里的问题和答案:您的基址和相对URI的尾随斜杠和前导斜杠错误。谢谢。我也尝试过同样的方法,但效果很好,所以为什么不从测试项目开始呢?也许你在这个所谓的测试项目中有什么东西阻止了它的工作。在不显示代码的情况下很难判断是什么。我已经向您展示了一个完全有效的示例。现在,如果你想让我猜你的测试项目中有什么代码,那么,很抱歉,这不会发生。我没有一个神奇的水晶球可以让我阅读别人的想法/代码。谢谢。我也尝试过同样的方法,但效果很好,所以为什么不从测试项目开始呢?也许你在这个所谓的测试项目中有什么东西阻止了它的工作。在不显示代码的情况下很难判断是什么。我已经向您展示了一个完全有效的示例。现在,如果你想让我猜你的测试项目中有什么代码,那么,很抱歉,这不会发生。我没有一个神奇的水晶球可以让我阅读别人的想法/代码。