我正在尝试使用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>}
我很遗憾没有太多事情要继续下去。
修改 请参阅下面的达林答案。我还把代码放在一个控制台应用程序中,它运行正常 - 为什么不在测试项目中?
有人能指出我可能出错的正确方向吗?
答案 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;
}