0

我正在尝试使用HttpClient来自 ASP.NET Web Api 的示例,但我在响应中收到状态代码 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>}

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

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

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

4

3 回答 3

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);
于 2013-05-16T13:39:27.323 回答
1

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

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

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

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

帮助!:)

于 2014-02-27T01:42:32.693 回答
0

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

    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;               
    }
于 2013-05-17T01:19:21.340 回答