在 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

单元测试 ASP.NET Web API

使用Http-Repl工具测试ASP.NET Core 2.2中的Web Api项目

在 ASP.NET Webforms 中启用跨域请求

ASP.NET Web API - HttpClient.PostAsync 本地 API 不会进入代码