Ответ 1
Web API по умолчанию будет игнорировать контроллеры, которые не являются общедоступными, а классы LinqPad являются вложенными, у нас была аналогичная проблема в scriptcs
Вы должны добавить пользовательский контроллер, который будет обходить это ограничение и позволить вам вручную открывать типы контроллеров из исполняющей сборки.
Это уже было исправлено уже (теперь контроллеры Web API должны быть видимыми не публичными), но это произошло в сентябре, а последняя стабильная версия собственного хоста - с августа.
Итак, добавьте это:
public class ControllerResolver: DefaultHttpControllerTypeResolver {
public override ICollection<Type> GetControllerTypes(IAssembliesResolver assembliesResolver) {
var types = Assembly.GetExecutingAssembly().GetExportedTypes();
return types.Where(x => typeof(System.Web.Http.Controllers.IHttpController).IsAssignableFrom(x)).ToList();
}
}
И затем зарегистрируйтесь в вашей конфигурации, и все будет готово:
var conf = new HttpSelfHostConfiguration(new Uri(address));
conf.Services.Replace(typeof(IHttpControllerTypeResolver), new ControllerResolver());
Вот полный рабочий пример, я только что протестировал LinqPad. Обратите внимание, что вы должны запускать LinqPad в качестве администратора, иначе вы не сможете прослушивать порт.
public class TestController: System.Web.Http.ApiController {
public string Get() {
return "Hello world!";
}
}
public class ControllerResolver: DefaultHttpControllerTypeResolver {
public override ICollection<Type> GetControllerTypes(IAssembliesResolver assembliesResolver) {
var types = Assembly.GetExecutingAssembly().GetExportedTypes();
return types.Where(x => typeof(System.Web.Http.Controllers.IHttpController).IsAssignableFrom(x)).ToList();
}
}
async Task Main() {
var address = "http://localhost:8080";
var conf = new HttpSelfHostConfiguration(new Uri(address));
conf.Services.Replace(typeof(IHttpControllerTypeResolver), new ControllerResolver());
conf.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
var server = new HttpSelfHostServer(conf);
await server.OpenAsync();
// keep the query in the 'Running' state
Util.KeepRunning();
Util.Cleanup += async delegate {
// shut down the server when the query execution is canceled
// (for example, the Cancel button is clicked)
await server.CloseAsync();
};
}