在 ASP.NET Web Api 中测试 HttpClient 时的状态码 500
Posted
技术标签:
【中文标题】在 ASP.NET Web Api 中测试 HttpClient 时的状态码 500【英文标题】:Status Code 500 when testing HttpClient in ASP.NET Web Api 【发布时间】: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 无关,但您可以尝试一下)
看看我的问题并在这里回答:***.com/q/23438416/1828879您的 BaseAddress 和相关 URI 的尾随和前导斜杠错误。
【参考方案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;
【讨论】:
以上是关于在 ASP.NET Web Api 中测试 HttpClient 时的状态码 500的主要内容,如果未能解决你的问题,请参考以下文章
在 ASP.NET Web API 控制器的 nunit 测试中实例化新的 System.Web.Http.OData.Query.ODataQueryOptions
ASP.NET Core Web API中使用Swagger