2014-10-30 3 views
2

Это должно быть так просто, и я чувствую, что я просто что-то пропустил. Я новичок в HTTP-стороне этого приложения, поэтому мне также кажется, что я снимаю в темноте.Доступ к многостраничному объекту HTTP-запроса через C# IHttpHandler

Мы делаем B2B EDI. Мы получим многостраничный запрос POST. Каждая часть представляет собой XML. Мне нужно извлечь каждую часть и преобразовать каждый в XmlDocument.

Вот что я написал.

using System; 
using System.Collections.Generic; 
using System.Web; 
using System.Xml; 

namespace Acme.B2B 
{ 
    public class MultipleAttachments : IHttpHandler 
    { 
     #region IHttpHandler Members 

     public bool IsReusable { get { return true; } } 

     public void ProcessRequest(HttpContext context) 
     { 
      var ds = extractDocuments(context.Request); 

      return; // Written for debugging only. 
     } 

     #endregion 

     #region Helper Members 

     private IEnumerable<XmlDocument> extractDocuments(HttpRequest r) 
     { 
      // These are here for debugging only. 
      var n = r.ContentLength; 
      var t = r.ContentType; 
      var e = r.ContentEncoding; 

      foreach (var f in r.Files) 
       yield return (XmlDocument)f; 
     } 

     #endregion 
    } 
} 

Я довольно уверен, что (XmlDocument)f не будет работать, но я до сих пор изучают. Как ни странно, установив точку останова на var n = r.ContentLength;, код никогда не попадает в эту точку останова. Он просто попадает в точку останова, установленную на постороннем return;.

Что, черт возьми, я пропустил?

+0

Какой тип 'Files'? Является ли он явно конвертируемым в 'XmlDocument'? –

+0

'Files' имеет тип' HttpFileCollection'. Я уверен, что он не конвертируется в 'XmlDocument'. Это всего лишь ознакомительный код прямо сейчас. –

ответ

2

Вы должны использовать HttpPostedFile.InputStream и передать его на XDocument конструктор:

foreach (HttpPostedFile postedFile in r.Files) 
{ 
    yield return XDocument.Load(postedFile.InputStream); 
} 

Или, если вы хотите XmlDocument:

foreach (HttpPostedFile postedFile in r.Files) 
{ 
    yield return new XmlDocument().Load(postedFile.InputStream); 
} 
+0

О, черт возьми! Я ожидал указаний на ответ, а не на сам ответ. Спасибо огромное! Это требует изменения сигнатуры метода, возвращая XDocument вместо XmlDocument. Но я возьму! –

+0

@Jeff вы всегда можете создать экземпляр «XmlDocument» и передать поток методу «Загрузить». –

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