【发布时间】:2012-05-29 10:23:29
【问题描述】:
在in-memory test 中测试 ASP.NET Web API 控制器时,我收到“内部服务器错误”(状态代码 500)。
[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;
}
}
我已将 Visual Studio 配置为在引发任何 .Net 异常时中断。代码不会因任何异常而停止,我也无法在响应中找到任何异常详细信息。
我应该怎么做才能查看导致“内部服务器错误”的原因?
【问题讨论】:
-
堆栈跟踪是什么样的?把它放在这里。
-
嗯,这就是问题所在。我没有得到堆栈跟踪。只有一个响应说“内部服务器错误”
-
// additional configuration是什么意思?你有没有省略一些代码? -
更新了帖子,增加了评论。但那里没有例外。代码到达“var response = ...”
-
对我来说,我发现我缺少 IncludeErrorDetailPolicy。一旦我将它包含在 hte HttpConfiguration 的创建中,我就能看到错误。希望这对其他人有帮助!