2011-03-27 21 views
6

मैं एक बग हल करने के लिए जहां आरएसएस के सभी फ़ीड मैं उत्पादन कर रहा हूँ http://captainobvio.us इंटरनेट एक्सप्लोरर में निम्न त्रुटि उत्पादन पर कोशिश कर रहा हूँ (संस्करण 8 और 9):नेट ServiceModel.Syndication - बदल रहा है आरएसएस पर एन्कोडिंग फ़ीड

फ़ीड कोड त्रुटि वर्तमान निर्दिष्ट एन्कोडिंग पर एन्कोडिंग समर्थित है। रेखा: 1 चरित्र: 40

<?xml version="1.0" encoding="utf-16"?> 

मुद्दा यह है कि वास्तविक एन्कोडिंग HTTP हेडर के माध्यम से भेजा प्रकार क्या दस्तावेज़ वाणी की तुलना में अलग है।

public ContentResult Index() 
     { 
      var feed = _syndication.SyndicateIdeas(_repository.GetIdeas(0,15).Ideas); 

      var sb = new StringBuilder(); 
      using (var writer = XmlWriter.Create(sb, new XmlWriterSettings { Encoding = Encoding.UTF8, NewLineHandling = NewLineHandling.Entitize, NewLineOnAttributes = true, Indent = true})) 
      { 
       feed.SaveAsRss20(writer); 
       writer.Close(); 
      } 

      return Content(sb.ToString(), "application/rss+xml", Encoding.UTF8); 
     } 

और यहाँ मेरे कोड वास्तव में .NET 4.0 में, फ़ीड बनाने System.ServiceModel.Syndication प्रयोग करने के लिए ऐसा दिखाई देता है:

यहाँ मेरी कोड HTML में चारा उत्पादन लिखने के लिए कैसा दिखता है
var feed = new SyndicationFeed("CaptainObvio.us - Recent Ideas", 
              "The most recent ideas posted by the Community on CaptainObvio.us", new Uri("http://captainobvio.us/"), "CaptainObvio.us", new DateTimeOffset(ideas[0].DatePosted), items) 
          { 
           Generator = "CaptainObvio.us - http://captainobvio.us/" 
          }; 

      return feed; 

मैं क्या करना चाहता हूं XML दस्तावेज़ को utf-16 के बजाय utf-8 पढ़ने के लिए बदलना है। मैंने यह देखने के लिए एन्कोडिंग नेमस्पेस की भी जांच की कि क्या यूटीएफ 16 विकल्प था (इसलिए मैं XML दस्तावेज़ के बजाय HTTP शीर्षलेख को सही कर सकता था) और वह एक नहीं ढूंढ पाया।

क्या XML दस्तावेज़ पर सीधे एन्कोडिंग विशेषता को System.ServiceModel.Syndication से बदलना आसान तरीका है? इस मुद्दे को ठीक करने का सबसे आसान तरीका क्या है?

उत्तर

13

ऐसा इसलिए होता है क्योंकि आप XmlWriter निर्माता को स्ट्रिंगबिल्डर पास कर रहे हैं। .NET में स्ट्रिंग्स यूनिकोड हैं इसलिए XmlWriter utf-16 मानता है और आप इसे संशोधित नहीं कर सकते हैं।

तो तुम स्ट्रिंग बिल्डर के बजाय एक धारा इस्तेमाल कर सकते हैं, तो आप सेटिंग्स के साथ एन्कोडिंग नियंत्रित कर सकते हैं:

var settings = new XmlWriterSettings 
{ 
    Encoding = Encoding.UTF8, 
    NewLineHandling = NewLineHandling.Entitize, 
    NewLineOnAttributes = true, 
    Indent = true 
}; 
using (var stream = new MemoryStream()) 
using (var writer = XmlWriter.Create(stream, settings)) 
{ 
    feed.SaveAsRss20(writer); 
    writer.Flush(); 
    return File(stream.ToArray(), "application/rss+xml; charset=utf-8"); 
} 

यह सब किया जा रहा है कहा कहीं ज्यादा बेहतर है, और अधिक MVCish और एक एक मैं तुम्हें सिफारिश करेंगे समाधान लिखना है एक SyndicationResult:

public class SyndicationResult : ActionResult 
{ 
    private readonly SyndicationFeed _feed; 
    public SyndicationResult(SyndicationFeed feed) 
    { 
     if (feed == null) 
     { 
      throw new HttpException(401, "Not found"); 
     } 
     _feed = feed; 
    } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     var settings = new XmlWriterSettings 
     { 
      Encoding = Encoding.UTF8, 
      NewLineHandling = NewLineHandling.Entitize, 
      NewLineOnAttributes = true, 
      Indent = true 
     }; 

     var response = context.HttpContext.Response; 
     response.ContentType = "application/rss+xml; charset=utf-8"; 
     using (var writer = XmlWriter.Create(response.OutputStream, settings)) 
     { 
      _feed.SaveAsRss20(writer); 
     } 
    } 
} 

और अपने नियंत्रक कार्रवाई बस इस परिणाम लौट ताकि आप पाइपलाइन कोड के साथ अपने नियंत्रक कार्यों को अव्यवस्थित नहीं करते में:

public ActionResult Index() 
{ 
    var ideas = _repository.GetIdeas(0, 15).Ideas; 
    var feed = _syndication.SyndicateIdeas(ideas); 
    return new SyndicationResult(feed); 
} 
+2

डारिन, उत्कृष्ट उत्तर। मैंने स्ट्रिंगबिल्डर को इस मुद्दे के स्रोत के रूप में देखने का भी विचार नहीं किया था, और एक्शन रिसेट के उप-वर्गीकरण के आपके सुझाव उत्कृष्ट हैं। अगर मैं आपको एक से अधिक बार बढ़ा सकता हूं, तो मैं चाहता हूं। – Aaronontheweb

+0

@Aaronontheweb, खुशी है कि मैं मदद कर सकता हूं। –