Ответ Алекс хороший. Но мне нравится правильное спаривание. По этой причине, если представление не нужно уведомлять, когда его даже не видно, я обычно добавляю уведомление в viewWillAppear и viewDidDisappear
Web API создан для поддержки модульного тестирования, позволяя вам издеваться над различными объектами контекста. Однако, используя HttpContext.Current
, вы используете код «старого стиля» System.Web
, который использует класс HttpContext
, который делает невозможным модульное тестирование вашего кода.
Чтобы ваш код был единицей вы должны остановить использование HttpContext.Current
. В Отправка данных формы HTML в веб-API ASP.NET: загрузка файлов и многопользовательский MIME вы можете увидеть, как загружать файлы с помощью веб-API. Как ни странно, этот код также использует HttpContext.Current
для доступа к MapPath
, но в Web API вы должны использовать HostingEnvironment.MapPath
, который также работает за пределами IIS.
Не используя HttpContext.Current
, вы можете тестировать ваш контроллер, назначив свойство ControllerContext
контроллера:
var content = new ByteArrayContent( /* bytes in the file */ );
content.Headers.Add("Content-Disposition", "form-data");
var controllerContext = new HttpControllerContext {
Request = new HttpRequestMessage {
Content = new MultipartContent { content }
}
};
var controller = new MyController();
controller.ControllerContext = controllerContext;
Принятый ответ идеально подходит для вопроса OP. Я хотел добавить мое решение здесь, которое происходит от Мартина, поскольку это страница, на которую я был направлен, когда просто искал, как выкачать объект Request для Web API, чтобы я мог добавлять заголовки, которые ищет мой контроллер. Мне было трудно найти простой ответ:
var controllerContext = new HttpControllerContext();
controllerContext.Request = new HttpRequestMessage();
controllerContext.Request.Headers.Add("Accept", "application/xml");
MyController controller = new MyController(MockRepository);
controller.ControllerContext = controllerContext;
И вот вы; очень простой способ создать контекст контроллера, с помощью которого вы можете «отморозить» объект «Запрос» и предоставить правильные заголовки для вашего метода контроллера.
Content-Disposition
для внутреннего содержимого, а не для содержимого с несколькими частями. – Martin Liversage 3 July 2015 в 07:52