【问题标题】:Status Code 500 when testing HttpClient in ASP.NET Web Api在 ASP.NET Web Api 中测试 HttpClient 时的状态码 500
【发布时间】:2013-05-16 13:13:30
【问题描述】:

我正在尝试使用来自 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>}

很抱歉,这没什么好说的。

编辑 请参阅下面达林的回答。我还将代码放在控制台应用程序中,它工作正常 - 那么为什么不在测试项目中呢?

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

【问题讨论】:

  • 打开跟踪并添加一个 ConsoleListener ,您应该会看到问题出现在哪里。
  • 在上面的代码中得到响应后,可以response.Content.ReadAsStringAsync().Result 看看是否能得到更多关于错误的详细信息吗?另外,如果没有错误详细信息,您可以尝试将错误详细信息策略设置为 Always config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always(这与它的 localhost 无关,但您可以尝试一下)
  • 看看我的问题并在这里回答:stackoverflow.com/q/23438416/1828879您的 BaseAddress 和相关 URI 的尾随和前导斜杠错误。

标签: asp.net-web-api httpclient


【解决方案1】:

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

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

【讨论】:

  • 谢谢。我尝试了同样的方法,它可以工作,为什么不在测试项目中呢?
  • 也许你在这个所谓的 test project 中有一些东西阻止它工作。如果不显示您的代码,很难说出什么。我已经向您展示了一个完整的工作示例。现在,如果您希望我猜测您在测试项目中的代码是什么,那么,对不起,这不会发生。我没有一个魔法水晶球可以让我读懂别人的思想/代码。
【解决方案2】:

这个内存托管的东西很棒。但是.....

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

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

在 IIS express 中托管时运行良好....我只在内存中托管时看到问题。

帮助! :)

【讨论】:

    【解决方案3】:

    我不确定为什么 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;               
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多