Internal server error in an ASP.NET Web API in-memory test
asp.net, asp.net-web-api
Solution
The exception is in Response.Content
if (Response != null && Response.IsSuccessStatusCode == false)
{
var result = Response.Content.ReadAsStringAsync().Result;
Console.Out.WriteLine("Http operation unsuccessful");
Console.Out.WriteLine(string.Format("Status: '{0}'", Response.StatusCode));
Console.Out.WriteLine(string.Format("Reason: '{0}'", Response.ReasonPhrase));
Console.Out.WriteLine(result);
}
Problem
I get an "internal server error" (status code 500) when testing an ASP.NET Web API controller in an in-memory test. ``` [TestFixture] public class ValuesControllerTest { private HttpResponseMessage response; [TestFixtureSetUp] public void Given() { var config = new HttpConfiguration { IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always }; config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { controller = typeof(ValuesController).Name.Replace("Controller", string.Empty), id = RouteParameter.Optional } ); //This method will cause internal server error but NOT throw any exceptions //Remove this call and the test will be green ScanAssemblies(); var server = new HttpServer(config); var client = new HttpClient(server); response = client.GetAsync("http://something/api/values/5").Result; //Here response has status code 500 } private void ScanAssemblies() { PluginScanner.Scan(".\\", IsApiController); } private bool IsApiController(Type type) { return typeof (ApiController).IsAssignableFrom(type); } [Test] public void Can_GET_api_values_5() { Assert.IsTrue(response.IsSuccessStatusCode); } } public static class PluginScanner { public static IEnumerable<Type> Scan(string directoryToScan, Func<Type, bool> filter) { var result = new List<Type>(); var dir = new DirectoryInfo(directoryToScan); if (!dir.Exists) return result; foreach (var file in dir.EnumerateFiles("*.dll")) { result.AddRange(from type in Assembly.LoadFile(file.FullName).GetTypes() where filter(type) select type); } return result; } } ``` I have configured Visual Studio to break when any .Net exception is thrown. Code is not stopped at any exception nor can I find any exception details in the response. What should I do to see what's causing the "internal server error"?