2013-11-22 3 views
1

Этот код работает в консольном приложении, но не MVC:StreamReader терпит неудачу в MVC

XmlSerializer s = new XmlSerializer(typeof(IDChckRspn)); 
StreamReader r = new StreamReader(@"d:\temp\response.xml"); 
object obj = s.Deserialize(r); 
IDChckRspn _response = (IDChckRspn)obj; 

В отлаживать в консольном приложении я могу углубиться в S, R, OBJ и _response. В приложении MVC, если я попытаюсь просверлить их, они не откроются. Иногда он будет работать в MVC, но большую часть времени его нет. Я подозреваю, что это связано с загрузкой файла, потому что если я помещаю точку останова на объект obj, я до сих пор не могу сверлить в r в приложении MVC, но могу в консольном приложении. У меня есть аналогичные проблемы с использованием FileStream в приложении MVC.

Update 1 После Sleiman-х и Daniels предложение я сейчас, используя этот код:

IDChckRspn response; 
using (var r = new StreamReader(HttpContext.Server.MapPath("~/App_Data/response.xml"))) 
{ 
    response = new XmlSerializer(typeof(IDChckRspn)).Deserialize(r) as IDChckRspn; //'as' rather than a cast won't throw an exception 
} 

, но по-прежнему получать тот же результат, не исключение и не может просверлить в окно Locals, чтобы посмотреть на ответ. Точка останова находится на следующей строке после этого кода.

Update 2 Я объявил переменную в действии, которое содержит этот код var test = "";. При этом у меня есть проблема (точка останова при возврате View;). Если я прокомментирую декларацию, проблема будет устранена. Если я перемещу точку останова в строку response = и пройду через нее, она работает даже с объявлением переменной там.

public ActionResult VerifyID() 
{ 
    IDChckRspn response; 
    using (var r = new StreamReader(HttpContext.Server.MapPath("~/App_Data/response.xml"))) 
    { 
    response = new XmlSerializer(typeof(IDChckRspn)).Deserialize(r) as IDChckRspn; //'as' rather than a cast won't throw an exception 
    } 

    var test = ""; 
    return View(); 
} 

Почему объявление переменной в действии вызывает отказ .Deserializer?

+0

Любые ошибки? Выбрасывает ли какие-либо исключения? Будучи MVC, я подозреваю, что у этого файла нет разрешений для INETUSR. – Gobo

+0

Подключитесь ли вы к процессу w3wp или запуску сайта из отладчика? –

+0

Вы должны разместить дополнительную информацию, такую ​​как Исключение! – Fals

ответ

2

Я подозреваю, что это может быть связано с тем, что вы не закрываете StreamReader с помощью r.Close() или даже лучше, помещая его в предложение use.

Тот факт, что он иногда работает для вас, приводит меня к такому выводу. Возможно, ваш веб-хостинг-процесс держится на открытом потоковом устройстве и заблокировал файл. Вы не получаете новый процесс каждый раз, когда запускаете приложение MVC - только при перекомпиляции.

Это не будет с консолью приложением задницы вы получаете новый процесс каждый раз, когда вы запускаете

XmlSerializer s = new XmlSerializer(typeof(IDChckRspn)); 
object obj; 
using (StreamReader r = new StreamReader(@"d:\temp\response.xml")) 
{ 
    obj = s.Deserialize(r); 
} //streamreader is closed here and access to the file is released 

IDChckRspn _response = (IDChckRspn)obj; 

Будь осторожен. Когда вы используете MVC, вы можете передать StreamReader непосредственно в ResponseStream, чтобы передать файл прямо в браузер. Это не похоже на то, что вы делаете, но просто имейте в виду: - в этой ситуации вы не захотите закрыть StreamReader, и вы не захотите использовать предложение use. Когда вы это сделаете, поток закрывается до отправки ответа, и вы получаете сообщение об ошибке. Вместо этого, когда метод Dispose в ResponseStream вызывается ASP.NET, StreamReader автоматически закрывается для вас.

Как и в сторону, следующий безопасный вариант кода ...

IDChckRspn response; 
using (var r = new StreamReader(@"d:\temp\response.xml")) 
{ 
    response = new XmlSerializer(typeof(IDChckRspn)).Deserialize(r) 
     as IDChckRspn; //'as' rather than a cast won't throw an exception 
} 
if (response == null) 
{ 
    //Log or throw new Exception("Couldn't convert'd:\temp\response.xml' to IDChckRspn"); 
} 
//else... success...use response 
+0

Это звучит как хорошая практика, но, к сожалению, не удалось устранить проблему. Я скопировал и наклеил ваш код дословно и получил тот же результат. Перезапущенный VS для хорошей меры, и он все еще не удался :( – Joe

+0

Вы видели комментарии с просьбой о том, что выбрано Exception? Есть ли какие-либо? –

+0

Снова замечательные предложения, но все тот же результат. Никаких исключений и не удается просверлить окно локалей. также добавлен в файл HttpContext.Server.MapPath Sleiman ("~/App_Data/response.xml")) и снова получил тот же самый отказ. – Joe

2

Я думаю, что проблема в том, что вы не должны получить доступ к локальным файлам в веб-приложениях, вместо этого вы можете положить ваши файлов в App_Data folder

using (var reader = new StreamReader(HttpContext.Server.MapPath("~/App_Data/response.xml"))) 
{ 
// make sure you use using statement, it closes the file for you 
} 
+0

Хорошее предложение, но не устраняет ошибку. Даже когда я включил твою книгу в вторую версию кода Дэниела. – Joe

Смежные вопросы