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